|
近期,我们成功将一款产品与支付宝服务窗进行了对接,但在接入过程中遇到了一些挑战,这些经验教训可供后来者参考。支付宝服务窗在界面设计和技术对接方面,与微信公众号的相似度相当高,对于那些有过公众号对接经验的人,服务窗的接入过程可谓是得心应手。
接入前的准备工作:
申请获取开发资质的过程涉及提交企业相关信息,并经历审核阶段,这一步骤的具体细节此处不予详述。
创建服务窗口应用的公钥与私钥,这两者可以与APP支付功能共享同一套证书。在填写应用公钥时,只需使用一个应用公钥即可。证书的生成流程相对简便,但需留意在支付宝的后台操作中应正确填写公钥证书。
常见问题: 一.与支付宝互相交换公钥
.地址:
如上图所示,
“查看应用公钥” 即可填写自己应用的公钥.
“查看支付宝公钥” ,将支付宝公钥放到你的项目中。
二.需激活开发者模式
服务窗应用需激活开发者模式后 ,才可以使用。
2.1. 下载服务端sdk:
部署至服务器。
在修改.php文件时,需将逗号符号替换为相应的支付宝公钥证书,同时更新应用的公钥和私钥(这两者可以与app支付共用的)。
2.2 激活网关 (你的应用id)
应用网关 那一栏,激活弹出如下对话框 。
支付宝服务窗应用网关填写说明
应用网关中的demo部分,其.php文件的地址,必须部署在服务器上,且该服务器必须能够被外网访问。
采用公钥加密技术(例如RSA算法),能够生成相应的公钥证书,在此过程中,我所使用的是适用于app支付的公钥证书。
经过验证确认无误后,公众号中的用户相关事件便能够被传输至应用网关。这包括但不限于订阅事件、消息事件等。
注意:
1.在红色对话框里面填写的公钥要过滤:
1.—–—–,—–—–
2.过滤掉回车(0x0D,0x0A)、空格。
对于.php的响应,系统将读取并筛选本地的公钥信息,随后将这些筛选后的内容嵌入到响应的XML文件中,并通过特定节点发送给支付宝。支付宝将利用网页上填写的公钥进行签名验证,若发现签名不匹配,即填写的公钥与服务器返回的公钥不一致,系统将返回错误信息。
3.访客身份ID获取:
支付宝服务窗提供了2种方式获取用户信息:
1.用户访问授权页面,并且授权成功。
此方法实施需用户同意,进而能够收集更全面的用户资料,诸如标注过的账户和用户名等。若仅是为了获取访客的唯一标识,则建议考虑采用其他方案。
2.获取用户。 使用 可以获取到即为用户的永久标识ID。
两种方法在本质上都利用将访客导向支付宝指定的API,支付宝将执行用户身份的验证。验证成功后,用户的认证信息会被附加到URL中,随后跳转回事先设定的URL。这样一来,我们便可以获取用户的相关信息,甚至更多的资料。
需要指出的是,这两种途径均无法获取支付宝访客的头像信息(这是通过咨询技术客服所获得的答复)。
参考文档:
四.签名失败问题:
在使用官方demo进行支付宝服务器向应用网关推送消息时,务必留意网关回调url的设置,避免采用包含动态参数的地址。例如,以下这种格式的地址是无法通过签名验证的。其原因是.php验证函数在传参时存在缺陷,具体代码如下:
<p><pre class="pure-highlightjs" style="font-size:16px; font-family:Inconsolata,monospace; border:none; line-height:1.3125; margin-top:0px; margin-bottom:1.75em; max-width:100%; overflow:auto; padding:0px; white-space:pre-wrap; word-wrap:break-word; background-color:rgb(255,255,255); color:rgb(26,26,26)"> <code class="hljs nginx" style="font-size:1em; font-family:Inconsolata,monospace; background:rgb(240,240,240); padding:0.5em; display:block; overflow-x:auto; color:rgb(68,68,68)"><span class="hljs-attribute" style="font-weight:bold">rsaCheckV2</span> ( <span class="hljs-variable" style="color:rgb(188,96,96)">$_REQUEST</span>, <span class="hljs-variable" style="color:rgb(188,96,96)">$config</span> [<span class="hljs-string" style="color:rgb(136,0,0)">禁止对'ali_fwc_public_key_path'进行修改。</span>] );</code></pre></p>
参数验证只需针对POST数据进行即可,但若回调URL中包含动态参数,便会将GET参数一并纳入签名计算之中,导致签名验证必然不通过。官方的表述,似乎有过度装饰之嫌。
解决方法:
方法1.使用静态url 例如:
方法2.修改官方demo代码,把$ 修改为$_POST.
<p><pre class="pure-highlightjs" style="font-size:16px; font-family:Inconsolata,monospace; border:none; line-height:1.3125; margin-top:0px; margin-bottom:1.75em; max-width:100%; overflow:auto; padding:0px; white-space:pre-wrap; word-wrap:break-word; background-color:rgb(255,255,255); color:rgb(26,26,26)"> <code class="hljs nginx" style="font-size:1em; font-family:Inconsolata,monospace; background:rgb(240,240,240); padding:0.5em; display:block; overflow-x:auto; color:rgb(68,68,68)"><span class="hljs-attribute" style="font-weight:bold">rsaCheckV2</span> ( <span class="hljs-variable" style="color:rgb(188,96,96)">$_POST</span>, <span class="hljs-variable" style="color:rgb(188,96,96)">$config</span> [<span class="hljs-string" style="color:rgb(136,0,0)">'ali_fwc_public_key_path'</span>] );</code></pre></p> |
|