这几天因为人事调动,后台的事情我也要参与一些,先是支付宝的审核签约APP支付搞得焦头烂额,更因为PHP后台使用的是14年的支付宝后台导致客户端也要随之变化,最近支付宝更新了SDK2.0签名方式发展RSA2,初来乍到的我,跌跌爬爬终于成功支付,特将经验总结至此
1.签约的坑
签约功能一般来说,最初签约完开发者通常只有当面付和手机网站支付两个途径
手机网站支付即调用Web的支付宝付款,在APP中也可以将Web支付变为自己的支付途径
但相比而言原生APP支付更加方便
在申请APP支付签约时首先要进入商家中心签好约不然所有的APP支付签约会被支付宝取消(如下图)
我的痛支付宝商家平台地址
签约完毕之后就能愉快的发起支付啦
2.旧版本的坑
因为后台是PHP且用的是14年的sdk,有些区别需要理清楚
- 签名方式:旧版 RSA 新版RSA2
- 配置信息:旧版 只需paternerId,secert key,sellerId(支付宝账户)开发者公钥和APP公钥(一样的密钥)
新版则需多出识别的APPID,sellerId的值要与paternerId相同
3.签名的坑
因为我是PHP服务器在我理解错误下签名搞了很久
生成密钥
java服务器选择PKCS8格式 php服务器选择PKCS1格式
确定了密钥长度后就可以生成密钥了
密钥有两种1.应用私钥2.应用公钥 这两种密钥互相对应分别对应于支付宝平台和服务器
应用公钥即设置在支付宝中暴露给外界的,客户端在调用支付时支付宝会将两者匹配,匹配不成功时会出现错误
如果只是密钥对应不上就会报这个错
密钥对应不上而若是其他key和PID都不对的话,说明其他配置信息都有错误需要仔细排查
密钥及其他配置信息有误在这个过程中的坑点就是支付宝不会返回具体的返回码当你按下确定或者退出时
返回一个用户取消的消息所以你只能自己找错误,真的皮!
公钥的放置地方:下图的3个密钥平台的RSA或者RSA2都要填同一公钥
公钥设置
而私钥则是存放在服务器中通过订单生成和签名encoding返回给客户端的
这里PHP最坑的是支付宝提供的签名工具模拟签名时请求参数要带上sign_type导致签名后的结果与服务器返回的结果完全不符,所以无法验证服务器的签名到底是否正确
还有支付宝提供的demo不支持PKCS1的密钥(你TM逗我?)而且使用SDK进行的服务器上的签名报错?????最后找了个办法只好让服务器的密钥转化为PKCS8才能成功签名返回并客户端提交支付成功
不多说了一口老血吐出来,若是后台兄弟在这问题半天就搞定了,就当涨姿势了,希望后头的兄弟不要因为这样的事情而浪费时间,做项目卡住只能怪技术,而为第三方接入浪费大把时间真的不值,以此训,教诲吾身.
网友评论