Skrill Quick Payment API HTML Form 提示商户邮箱错误
结论
Wrong merchant email address! 表示 Skrill 当前不认可 pay_to_email 对应的收款商户邮箱。常见原因包括:
- 该邮箱尚未注册 Skrill 账户;
- 该账户仍是个人账户,尚未开通商户收款或 Quick Checkout;
- 表单中的邮箱不是商户账户已验证且可用于收款的邮箱;
- 正式支付入口使用了测试账户邮箱,或者测试环境使用了正式商户邮箱;
- 表单仍在使用 Moneybookers 时代的旧提交地址。
示例中的 Gmail 地址本身并不会引发错误,问题在于它是否属于已经启用收款功能的 Skrill 商户账户。status_url 指向 localhost 也不会触发这条邮箱错误,但 Skrill 无法通过公网访问该地址,后续状态通知将无法送达。
应当如何处理
先登录 Skrill 商户后台,逐项确认:
- 账户已经完成商户注册和必要的审核。
- Quick Checkout 或相应的在线收款功能已经启用。
pay_to_email与商户后台显示的已验证收款邮箱完全一致。- 测试账户只用于测试环境,正式商户账户只用于正式环境。
- 如果刚申请商户功能,需要确认 Skrill 已完成开通。仅创建普通钱包账户还不够。
旧表单提交到:
https://www.moneybookers.com/app/payment.pl
这是 Moneybookers 时代的旧入口。新版 Quick Checkout 通常使用:
https://pay.skrill.com
实际可用的入口和账户权限,应以当前商户后台提供的集成资料为准。
可用的基础 HTML 表单
下面是一个精简的正式环境示例。使用时请将邮箱、订单号和回调地址替换为真实值:
<form action="https://pay.skrill.com" method="post">
<input type="hidden" name="pay_to_email"
value="merchant@example.com">
<input type="hidden" name="transaction_id"
value="ORDER-20260910-0001">
<input type="hidden" name="status_url"
value="https://example.com/payments/skrill/status">
<input type="hidden" name="return_url"
value="https://example.com/payments/success">
<input type="hidden" name="cancel_url"
value="https://example.com/payments/cancel">
<input type="hidden" name="language"
value="EN">
<input type="hidden" name="amount"
value="100.00">
<input type="hidden" name="currency"
value="USD">
<input type="hidden" name="detail1_description"
value="Payment reason">
<input type="hidden" name="detail1_text"
value="Donation Due Payment Invoice">
<button type="submit">Pay Through Skrill</button>
</form>
各字段的含义如下:
pay_to_email:已经启用 Skrill 收款功能的商户邮箱;transaction_id:商户系统中的唯一订单号;status_url:用于接收 Skrill 服务器通知的公网 HTTPS 地址;return_url:付款完成后用户返回的页面;cancel_url:用户取消付款后返回的页面;amount:付款金额,建议固定为两位小数;currency:商户账户支持的 ISO 4217 货币代码。
修正 PHP 表单
不要直接使用浏览器提交的 $_POST['amount']。服务器应根据订单重新查询或计算金额和订单信息。将数据写入 HTML 属性前,还需要进行转义:
<?php
$merchantEmail = 'merchant@example.com';
$transactionId = 'ORDER-' . date('YmdHis');
// 实际项目中应从数据库读取订单金额,不能直接采用客户端传入的金额。
$amount = 100.00;
function escapeHtml(string $value): string
{
return htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
?>
<form action="https://pay.skrill.com" method="post">
<input type="hidden"
name="pay_to_email"
value="<?= escapeHtml($merchantEmail) ?>">
<input type="hidden"
name="transaction_id"
value="<?= escapeHtml($transactionId) ?>">
<input type="hidden"
name="status_url"
value="https://example.com/payments/skrill/status">
<input type="hidden"
name="return_url"
value="https://example.com/payments/success">
<input type="hidden"
name="cancel_url"
value="https://example.com/payments/cancel">
<input type="hidden"
name="language"
value="EN">
<input type="hidden"
name="amount"
value="<?= number_format($amount, 2, '.', '') ?>">
<input type="hidden"
name="currency"
value="USD">
<input type="hidden"
name="detail1_description"
value="Payment reason">
<input type="hidden"
name="detail1_text"
value="Donation Due Payment Invoice">
<button type="submit">Pay Through Skrill</button>
</form>
回调地址不能使用 localhost
当前表单使用的地址是:
http://localhost/civicrm_development
Skrill 服务器访问这个地址时,localhost 指向的是 Skrill 自己的服务器,并不是开发者的电脑。因此,即使付款页面能够正常打开,状态通知也无法送达。
开发期间需要使用 Skrill 能够通过公网访问的 HTTPS 地址,例如:
https://dev.example.com/payments/skrill/status
如果使用临时隧道服务,回调地址变化后也要及时更新表单配置。
status_url 应指向专门处理服务器通知的接口,不宜只填写目录地址。接口收到通知后,应验证 Skrill 提供的签名或校验字段,再根据 transaction_id 更新订单状态。用户被重定向到 return_url 并不能证明付款成功,不能仅凭这次跳转就将订单标记为已支付。
仍然出现相同错误时
如果已经将提交地址改为 https://pay.skrill.com,但系统仍提示邮箱错误,通常需要检查账户状态,而不是 HTML 语法:
- 邮箱前后是否有空格;
- 邮箱是否与商户后台记录完全一致;
- 邮箱是否已经验证;
- 商户功能是否已经获批并启用;
- 账户是否支持接收所选币种;
- 是否混用了测试账户和正式支付入口;
- Skrill 是否对该账户、所在国家或业务类型设置了收款限制。
如果无法在后台确认这些信息,需要联系 Skrill 商户支持核查账户权限。修改表单参数不能将普通 Skrill 钱包账户变成可以通过 Quick Checkout 收款的商户账户。
备注:内容仅供参考。
