smartwalle / alipay

支付宝 AliPay SDK for Go, 集成简单,功能完善,持续更新,支持公钥证书和普通公钥进行签名和验签,支持文件上传和接口内容加密。
MIT License
1.85k stars 417 forks source link

签名验证失败问题 #186

Closed wwwAngHua closed 9 months ago

wwwAngHua commented 9 months ago

我使用 alipay.TradePreCreate{} 生成订单,它是能够正常返回付款URL付款的(当面付),但是我使用 aliPay_client.DecodeNotification 验证签名,请求是支付宝服务器发出的,但却一直验证失败,是什么原因?

完整代码

var aliPay_client, aliPay_err = alipay.New(ap[0].AlipayID, ap[0].AlipayPrivateKey, isSandbox(ap[0].Sandbox))
aliPay_client.LoadAliPayPublicKey(ap[0].AlipayPublicKey)
if aliPay_err != nil {
    return false
}
if err := ctx.Request.ParseForm(); err != nil {
    return false
}
var _, err = aliPay_client.DecodeNotification(ctx.Request.Form)
if err != nil {
    return false
}
alipay.ACKNotification(ctx.Writer)
return true
smartwalle commented 9 months ago

你提供给支付宝的回调url是否其它参数?

wwwAngHua commented 9 months ago

它是这样的http://api.t1y.net/1001/notify,没有任何参数。

smartwalle commented 9 months ago

看看这一行有没有返回错误 aliPay_client.LoadAliPayPublicKey(ap[0].AlipayPublicKey)

wwwAngHua commented 9 months ago

这行是没有错误的,公钥是正确的,并且能正常发起支付。

smartwalle commented 9 months ago

可以先看看错误是什么。

smartwalle commented 9 months ago

看一下是那个 err 导致的返回 false

wwwAngHua commented 9 months ago

我给每一个错误中都添加了日志输出,在aliPay_client.DecodeNotification(ctx.Request.Form)方法的错误中输出了:签名验证失败:crypto/rsa: verification error,该错误。

smartwalle commented 9 months ago

ap[0].AlipayPublicKey 这个公钥是哪里来的?

wwwAngHua commented 9 months ago

支付宝开放平台,支付宝公钥,代码中是从数据库中查询出来的

wwwAngHua commented 9 months ago

补充说明一下,目前是生产环境,ap[0].AlipayID是应用ID,ap[0].AlipayPrivateKey是应用私钥,ap[0].AlipayPublicKey是支付宝公钥

smartwalle commented 9 months ago

你成功调用过 alipay.TradePreCreate 这个接口,可以明确签名验证功能是没有问题的。不确定是不是数据的原因,或者你使用 master 分支试试。

wwwAngHua commented 9 months ago

支付宝返回的数据应该是这样子的:gmt_create=2023-12-08+11%3A34%3A49&charset=utf-8&seller_email=wwwanghua%40outlook.com&subject=%E6%B5%8B%E8%AF%95%E5%95%86%E5%93%81&sign=hQNQtXMkVbwK5c4bH52B9V2o0ZD5Kgsp85QVF4CG7Z%2BIS25n5Sa%2F611qepBVr0MMKlLz0FwK49ezNbPzU0cJAaAs9lKBPhO2812hjqfSUYyEqfsroccLvzAdpcfBGtgr%2Bd3QqDNPZP%2FzeAGG4IPx8svaFwAcmgd5V4p7yJK7vE4gBnish0iyz2yJapITHBFDaWJNXMCXLM8Hl1PTJNVFnLzmN4h7lULp4CGxHwoS7hhPIPZmJuXdvwBwt%2Fpea5sIK35HazB8NkWybyQP%2Bcjwv2hnA%2BuL8w3hBVdNa%2BXy%2F0Mj0OBp6I5gVFs0u4Bb857EYHlqrc1LHTVqrlqKKFNuFg%3D%3D&buyer_id=2088032638571663&invoice_amount=0.01¬ify_id=2023120801222113453071661463473897&fund_bill_list=%5B%7B%22amount%22%3A%220.01%22%2C%22fundChannel%22%3A%22ALIPAYACCOUNT%22%7D%5D¬ify_type=trade_status_sync&trade_status=TRADE_SUCCESS&receipt_amount=0.01&buyer_pay_amount=0.01&app_id=2021003139631839&sign_type=RSA2&seller_id=2088142819230127&gmt_payment=2023-12-08+11%3A34%3A53¬ify_time=2023-12-08+11%3A34%3A53&version=1.0&out_trade_no=1702006473879165925&total_amount=0.01&trade_no=2023120822001471661400120994&auth_app_id=2021003139631839&buyer_logon_id=183****2108&point_amount=0.00

代码中使用的库版本是:github.com/smartwalle/alipay/v3

wwwAngHua commented 9 months ago

支付宝返回的数据ify开头存在一个很奇怪的字符“¬”,它或许应该是&?

smartwalle commented 9 months ago

那个字符确实有问题,不知道是输出的问题,还是确实存在,自己追踪一下吧。

wwwAngHua commented 9 months ago

目前签名验证问题解决了,使用了alipay.ACKNotification(ctx.Writer)通知支付宝服务器,但是为什么支付宝服务器还是会一直发送异步通知,是正常情况还是?