通过 Alipay 这个 gem 包,调用支付宝的单笔转账的接口,
1 不传入收款方真实姓名是可以调用成功的,
2 但是如果多传入一个收款方的字段(参数为汉字),这个接口就调用失败(签名失败),支付宝接收到的汉字,是乱码,(服务端和代码里的编码格式都是 utf-8)
response = @client.execute(
method: 'alipay.fund.trans.toaccount.transfer',
biz_content: {
out_biz_no: '1603201806061445434920',
payee_type: 'ALIPAY_LOGONID',
payee_account: '支付宝账号',
amount: '1.0',
payee_real_name: '真实姓名',
remark: '备注:账号用户名匹配'
}.to_json(ascii_only: true)
)
支付宝那边接收到的是:
最开始这样实现的,是没有问题的
@client = Alipay::Client.new(url: "https://openapi.alipay.com/gateway.do",
app_id: Setting.alipay.appid,
app_private_key: File.read("lib/certificate/alipay_app_private_key.pem"),
alipay_public_key: File.read("lib/certificate/alipay_public_key.pem")
)
response = @client.execute(method: 'alipay.fund.trans.toaccount.transfer',
biz_content: {out_biz_no: '31880008821423432',
payee_type: 'ALIPAY_LOGONID',
payee_account: '***',
amount: '0.1'}.to_json(ascii_only: true))
可能是编码的问题,alipay 不认 utf-8 编码,或者处理方式和 ruby 不一样,可以尝试 pull/78 里面的方式用 gbk 编码。
不过不要期望我给出完整方案,因为我没有项目在用 alipay,现在只负责 merge,欢迎 PR。
估计是 rails 版本问题 还是使用 JSON.generate({ subject: '测试' }, ascii_only: true) 这种方式可以