支付宝接口手机网站支付验证返回字符串以及签名验证不通过的原因总结

已经不是第一次做支付接口开发了,每次做支付接口开发其实都会遇到一些麻烦。最主要的地方还是在验签(验证签名)部分。

验签的作用是判别支付结果的回调(同步返回,get方式)或者通知(异步post方式)是否真的是由支付宝的服务器发出的。


在这里有2个目的:1是记录一下这个通知的返回内容,2是列举一下目前支付宝接口开发过程中遇到的,可能影响验签通过的原因。


1.同步回调(get方式)返回的数据

以php为例,var_dump($_GET)得到的数组如下:

array
  'body' => string '用户账户充值' (length=18)
  'is_success' => string 'T' (length=1)
  'notify_id' => string '一长串balabalbabab的东西' (length=70)
  'notify_time' => string '2016-12-26 16:37:47' (length=19)
  'notify_type' => string 'trade_status_sync' (length=17)
  'out_trade_no' => string '20161226163712111782' (length=20)
  'payment_type' => string '1' (length=1)
  'seller_id' => string '2088521242126500' (length=16)
  'service' => string 'alipay.wap.create.direct.pay.by.user' (length=36)
  'subject' => string '用户账户充值' (length=18)
  'total_fee' => string '0.01' (length=4)
  'trade_no' => string '2016122621001004720297207882' (length=28)
  'trade_status' => string 'TRADE_SUCCESS' (length=13)
  'sign' => string 

'签名' (length=172)
  'sign_type' => string 'RSA' (length=3)

同步通知验签不能通过的原因:

1.生成密钥的方式不对,上传密钥的方式也不对,这点请按照开发文档的说明仔细检查。

2.返回的参数不干净,比如thinkphp的$_GET数组实际上会在数组结尾加上一个'_URL_'=>array(0=>'分组',1=>'控制器',2=>'方法')的数组项,所以在验签之前,要先unset($_GET['_URL_'])。


异步接口验签不通过的原因:

1.密钥生成和上传方式不对,请按照文档仔细检查。

2.防火墙原因,拦截了支付宝服务器的post请求,导致无法收到异步结果

3.异步结果的调试务必放到公网可以访问的服务器上进行调试,否则你是无法收到异步通知的,原因自己去想。

4.你的开发过程中,传递过去的异步通知url不能带有类似pay.php?id=1这样的参数,必须是到一个最终的处理脚本的地址,比如:http://www.xyservice.com/pay/ 或者 http://www.xyservice.com/pay.php

5.确保你的异步通知路径是可以访问的,如果访问不了,比如你的接口可能有权限验证,但支付宝接口直接post过来数据你认为没有登录,程序直接拒绝了而且302跳转到登录页面去了,或者有些主机商拦截了支付宝的post请求。


还有一点,有人说cacert.pem的路径不对也会影响验签,其实笔者在调试的时候因为需要刻意注释掉了cacert.pem的路径,结果在demo演示的时候,demo内容已经换成了笔者的pid和密钥信息之后,居然可以验签通过,所以就目前来看,这个ca证书的路径问题可能不是影响支付宝接口验签不通过的主要原因,当然,即便是这样您在开发过程中也要确保ca证书的路径正确,万一哪天接口开始验证ca证书了呢?


这是目前笔者在实际的开发过程中遇到的情况,记录下来,一是给遇到同样麻烦的朋友一个参考,二是给自己做个笔记。




你可能感兴趣的:(PHP)