作者:bluelucky2012 | 来源:互联网 | 2023-08-24 08:26
近日将一产品接入支付宝服务窗,接入过程遇到几点磕绊,记下也为后来者有所借鉴。支付宝服务窗无论界面到技术接入,同微信公众号相似度还是比较高的,做过公众号接入的,服务窗接入就是轻车熟路了。
接入前的准备工作:
1.申请开发资质.就是填写企业身份信息然后等待审核,这里不做赘述
2.生成服务窗应用的公钥,私钥。可以与app 支付共用一套证书。填写应用公钥时用一个应用公钥填写就可以了。证书生成过程还是比较简单的,要注意在支付宝后台填写的是公钥证书
常见问题:
一.与支付宝互相交换公钥
.地址:https://openhome.alipay.com/platform/keyManage.htm
如上图所示,
“查看应用公钥” 即可填写自己应用的公钥.
“查看支付宝公钥” ,将支付宝公钥放到你的项目中。
二.需激活开发者模式
服务窗应用需激活开发者模式后 ,才可以使用。
2.1. 下载服务端sdk:https://fuwu.alipay.com/platform/doc.htm#c1101
部署至服务器。
修改config.php 里面的app_id , 替换对应的支付宝公钥证书,应用的公私钥(可以与app支付公用 的)。
2.2 激活网关 https://openhome.alipay.com/platform/appDetail.htm?tab=appSetting&appId=(你的应用id)
应用网关 那一栏,激活弹出如下对话框 。
支付宝服务窗应用网关填写说明
应用网关 :demo里面的Gateway.php 的地址,部署的服务器需要外网可访问的。
应用公钥 (RSA):openssl 生成的公钥证书 (这里我用的是app支付的公钥证书)。
2.3 验证通过后,公众号的用户事件就可以发送到应用网关了。例如:订阅事件、消息事件等等.
注意:
1.在红色对话框里面填写的公钥要过滤:
1.—–BEGIN PUBLIC KEY—– , —–END PUBLIC KEY—–
2. 过滤掉 回车(0x0D,0x0A )、空格。
Gateway.php 响应的xml response_xml会读取本地公钥内容进行过滤,并把过滤内容放在响应的xml,biz_content节点发给支付宝。支付宝会用biz_content 与 网页填写的公钥进行签名比对。不相等就会返回错误 :填写的公钥 与服务器返回的不一致。
3.访客身份ID获取:
支付宝服务窗提供了2种方式获取用户信息:
1.用户访问授权页面,并且授权成功。
这种方式必须需要用户授权,可以获取更多的用户信息,例如包含加星的用户账号及加星的用户名。如果仅仅是想获取访客的身份ID,那么推荐使用第二种。
2.获取用户OpenId。 使用auth_code 可以获取到OpenId即为用户的永久标识ID。
2种方式本质上都是通过js 将访客跳转至支付宝一api,支付宝会对用户进行身份认证,通过后将用户认证信息(auth_code)的附加在url上跳转回到redirect_uri 定义的url上。获取到用户的auth_code后就可以进一步获取用户的OpenId或更多信息了。
需要说明的是,这2种方式都不能获取支付宝访客头像(咨询了技术客服得到的答案)。
参考文档:https://fuwu.alipay.com/platform/doc.htm#c0205
四.签名失败问题:
4.1 支付宝服务器向应用网关推送消息时,如果使用官方demo时,特别要注意网关回调url不要使用动态参数地址,例如http://xytong.cc/pay?type=alipay 这种格式是通不过签名验证的。原因是gateway.php 的验证函数传参有问题,见如下代码:
rsaCheckV2 ( $_REQUEST, $config ['ali_fwc_public_key_path'] );
参数验证本来验证post数据就可以了,如果回调url 有动态参数,就会把get参数也传入进行计算签名,结果当然是签名验证失败.官方这样写,有画蛇添足之嫌.
解决方法:
方法1.使用静态url 例如:http://xytong.cc/pay/alipay
方法2.修改官方demo代码,把$_REQUEST 修改为$_POST.
rsaCheckV2 ( $_POST, $config ['ali_fwc_public_key_path'] );
来源:http://xytong.cc/archives/52