一, 概述
开发者生成私钥, 公钥之后, 将公钥提交给服务窗平台, 同时下载支付宝的公钥, 使用的方式验证签名之后便可完成接入.
开发者使用接口之前需要激活开发者模式, 请打开服务窗平台开发者模式 https://fuwu.alipay.com/platform/developerMode.htm , 点击下方的 "激活开发者模式" 按钮.
建议开发者使用支付宝提供的 SDK 进行服务窗开发, 使用 SDK 进行开发有以下优点:
SDK 会随着新接口的发布而同步更新
SDK 会随着老接口的更新而同步更新
SDK 让底层逻辑变得透明和简单, 开发者只需关注于自身的业务逻辑
SDK 集成了编码, 签名等常用方法, 开发者无需额外耗费时间
提供了基于 SDK 开发的 Demo, 开发者上手更容易
SDK 下载:
- Java-JDK 1.5 SDK
- Java-JDK 1.4 SDK
- PHP SDK
- .NET2010 SDK
Demo 下载:
- Java-JDK 1.5 Demo
- Java-JDK 1.4 Demo
- PHP Demo
- .NET2010 Demo
服务窗消息 Demo
标签组发接口 Demo
二, 填写开发者网关及开发者公钥
开发者将网关地址填入开发者网关一栏.
开发者将公钥文件去除头尾, 换行和空格后的字符串填入开发者公钥一栏.
转换前 pem 文件格式:
- -----BEGIN PUBLIC KEY-----
- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxL
- DkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unorm
- YQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/Q
- pkddCVXnZ4bAUaQjXQIDAQAB
- -----END PUBLIC KEY-----
转换后的字符串:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB
如下图所示:
三, 下载支付宝公钥
点击 "复制公钥" 按钮, 可以获取支付宝公钥, 支付宝公钥是经过格式化之后的字符串, 如果开发者需要使用 pem 文件进行验签, 请点此下载 pem 公钥文件.
支付宝公钥:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB
PEM 格式化后的支付宝公钥:
- -----BEGIN PUBLIC KEY-----
- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkr
- IvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsra
- prwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUr
- CmZYI/FCEa3/cNMW0QIDAQAB
- -----END PUBLIC KEY-----
四, 使用支付宝公钥进行验签
当开发者完成网关代码的部署之后, 便可以点击 "提交" 按钮, 激活开发者模式, 接入服务窗平台.
此时, 支付宝网关会向开发者网关发送一条验证消息, 以 POST 方式请求, 以下为一个请求示例:
- REQUEST URL: https://example.com/gateway.do
- REQUEST METHOD: POST
- CONTENT:
- service=alipay.service.check
- sign=ntjOmXFGJMdfdMnrTL5rEp9QG8d0lDEoGg3ZHvqemHeI8BlQoEsFbhEn0IfQT+pvfJz5RCuE+3Qh1X7I4z5iTIiGjDBstc0xeuiAmtP9TrJZuw2jUAODFB9qOwBJLNcWlKHUGTU/db/qRsJQCj8EjoJvSi9MRM/xKv/XmduS/C4=
- sign_type=RSA
- charset=GBK
- biz_content=<?xml version="1.0" encoding="gbk"?><xml><AppId><![CDATA[2014072300007148]]></AppId><FromUserId></FromUserId><CreateTime><![CDATA[1406083506817]]></CreateTime><MsgType><![CDATA[event]]></MsgType><EventType><![CDATA[verifygw]]></EventType><ActionParam></ActionParam><AgreementId></AgreementId><AccountNo></AccountNo></xml>
开发者接收到该消息之后, 需要使用支付宝的公钥对签名作验证, 以确保该消息来源可靠.
将支付宝返回的 POST 参数 (不包含 sign 参数) 做字母排序, 组成 query 类型的字符串, 比如上文的 POST 请求组成的 query 类型字符串为:
biz_content=<?xml version="1.0" encoding="gbk"?><xml><AppId><![CDATA[2014072300007148]]></AppId><FromUserId></FromUserId><CreateTime><![CDATA[1406083506817]]></CreateTime><MsgType><![CDATA[event]]></MsgType><EventType><![CDATA[verifygw]]></EventType><ActionParam></ActionParam><AgreementId></AgreementId><AccountNo></AccountNo></xml>&charset=GBK&service=alipay.service.check&sign_type=RSA
将签名参数使用 base64 解码为字节码串
使用 OpenSSL 的验签方法及支付宝公钥验证签名, 以下为 PHP 代码的一个片段, 其中 $data 为经过 1 排序处理后的 query 字符串,$rsaPublicKeyFilePath 指支付宝公钥 PEM 文件的文件地址
- /* 使用支付宝的公钥对支付宝来的消息进行验签 */
- public function verify($data, $sign, $rsaPublicKeyFilePath) {
- /* 读取公钥文件, PEM 格式 */
- $pubKey = file_get_contents($rsaPublicKeyFilePath);
- /* 转换为 openssl 格式密钥 */
- $res = openssl_get_publickey($pubKey);
- /* 调用 openssl 内置方法验签 */
- $result = (bool) openssl_verify($data, base64_decode($sign), $res);
- /* 释放资源 */
- openssl_free_key($res);
- /* 返回验签结果 */
- return $result;
- }
五, 返回验签成功消息
开发者验签成功之后, 需要向支付宝网关回复一条消息, 表示验签成功. 支付宝收到符合规则的消息之后, 开发者模式就激活了. 以下为回复消息的格式(其中 biz_content 为开发者公钥):
- <?xml version="1.0" encoding="GBK"?>
- <alipay>
- <response>
- <biz_content>MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB</biz_content>
- <success>true</success>
- </response>
- <sign>DXr8LVfHytoZ3RR0K95pzGtA3d9LdpjIjLEis2BDIPQisPwS+FMFxZt9NCMt531EeDj/nbzoIAz8Or7PuqxNfSzNI8qnhirm/Hvr8uedXX9JiQxHu8q3Rw2lJWD8cqQzgf3xwV/+wbN8yuI7s8xjo6odq6NCqrAIu7E0DDfZyKo=</sign>
- <sign_type>RSA</sign_type>
- </alipay>
开发者可以参考相关 Demo(Demo 包请点此下载).
来源: http://www.bubuko.com/infodetail-2974442.html