支付宝支付接入(接入与验证)
2016-03-11 16:59
309 查看
原文:https://fuwu.alipay.com/platform/doc.htm#c11
一、概述
开发者生成私钥、公钥之后,将公钥提交给服务窗平台,同时下载支付宝的公钥,使用OpenSSL的方式验证签名之后便可完成接入。开发者使用接口之前需要激活开发者模式,请打开服务窗平台开发者模式,点击下方的“激活开发者模式”按钮。
建议开发者使用支付宝提供的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[/code]
如下图所示:
三、下载支付宝公钥
点击“复制公钥”按钮,可以获取支付宝公钥,支付宝公钥是经过格式化之后的字符串,如果开发者需要使用pem文件进行验签,请点此下载pem公钥文件。支付宝公钥: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB PEM格式化后的支付宝公钥: -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkr IvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsra prwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUr CmZYI/FCEa3/cNMW0QIDAQAB -----END PUBLIC KEY-----[/code]
四、使用支付宝公钥进行验签
当开发者完成网关代码的部署之后,便可以点击“提交”按钮,激活开发者模式,接入服务窗平台。此时,支付宝网关会向开发者网关发送一条验证消息,以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>[/code]
开发者接收到该消息之后,需要使用支付宝的公钥对签名作验证,以确保该消息来源可靠。
将支付宝返回的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[/code]
将签名参数使用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; }[/code]
五、返回验签成功消息
开发者验签成功之后,需要向支付宝网关回复一条消息,表示验签成功。支付宝收到符合规则的消息之后,开发者模式就激活了。以下为回复消息的格式(其中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>[/code]
开发者可以参考相关Demo(Demo包请点此下载)。
相关文章推荐
- OSGI框架搭建常见问题即错误
- ubuntu 下运行qtcreator
- 输入整数序列,最小的和第一个数对换,最大的和最后一个数对换
- .html文件转换成.txt
- 欢迎使用CSDN-markdown编辑器
- PAT (Advanced Level) Practise 1044 Shopping in Mars (25)
- 事务小结
- 如何优化Mysql执行查询数据的速度
- 【HDU 4416 】Good Article Good sentence 后缀数组
- 淘宝大秒系统设计详解
- 原生JavaScript 全特效微博发布面板效果实现
- 如何优化Mysql执行查询数据的速度
- 名字的漂亮度
- centos内网服务器搭建
- ubuntu14.04 忘记root密码
- java工具类小知识
- [Java代码] Java 面向对象
- Android安全教程(1)---Fiddler简易使用教程之配置环境
- win7主机用 vmware 安装 ubuntu 11.10后 打开3D加速
- android开发可以长去看看的网站