支付宝公众账号商户网关的搭建, RSA密钥对生成
来源:互联网 发布:淘宝网葫芦丝背包 编辑:程序博客网 时间:2024/04/29 22:30
作者: 玉龙 版权所有,允许转载, 请注明出处(创建金融_玉龙 http://www.weibo.com/u/1872245125)
原文地址: http://blog.csdn.net/yehuijun/article/details/24780119
支付宝的公众账号文档地址 http://open.alipay.com/index.htm
要开通支付宝的公众账号第一步就是要验证商户网关和开发者公钥的有效性。
https://openhome.alipay.com/doc/docIndex.htm?url=https://openhome.alipay.com/doc/viewKbDoc.htm?key=236714_422556&type=info
文档中忽略了一些细节, 本文进行如下一些细节补充。
1、 生成RSA公密钥对
通过openssl生成公密钥对, 在Linux系统下一般默认已有安装:
1、 让openssl随机生成了一份私钥,加密长度是1024位
openssl genrsa -out rsa_private_key.pem 1024
2、 根据私钥生成公钥
openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout
3、 私钥还不能直接被使用,需要进行PKCS#8编码
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -out pkcs8_rsa_private_key.pem -nocrypt
“去掉头和换行” 举例, 例如公钥如下
yulong$ more rsa_public_key.pem-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnlK8+l+YnhRd0SM9p/D2zhxAwsB9Zpt+mDlyyTSLwYPiBhmhemIvkPYHxllQrTop2GnNr4QuF2tGAw/ds5E5G+GGsEshN1F5R6rIN2eKk59/nV4f7jzVkV+iq+KfTg8MYAn76PtBUK7TyahnBX4U3UmusQGiCIhUyJpCOKrq5EQIDAQAB-----END PUBLIC KEY-----
转成代码中的使用的公钥为:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnlK8+l+YnhRd0SM9p/D2zhxAwsB9Zpt+mDlyyTSLwYPiBhmhemIvkPYHxllQrTop2GnNr4QuF2tGAw/ds5E5G+GGsEshN1F5R6rIN2eKk59/nV4f7jzVkV+iq+KfTg8MYAn76PtBUK7TyahnBX4U3UmusQGiCIhUyJpCOKrq5EQIDAQAB
注意如果公钥是放在XML中配置, 要加上 <![CDATA[]]> 防止XML转义
<property name="PublicKey"><value><![CDATA[${public_key}]]></value></property>
2、 商户网关的应答关键细节
在开启商户开发者模式时, 需要通过验证网关。 支付宝公众账号向配置的网关地址, 发送一个HTTTP POST请求, 商户网站必须要能够正确响应这个HTTP POST请求, 才能完成商户网关的验证。
验证的基本细节参见支付宝文档, 这里提两点文档中没有提及的问题。
首先被加签的内容是如下拼接完成的字符串
"<success>true/false</success><biz_content>开发者公钥</ biz_content>" 进行RSA加签, 可以调用支付宝提供的SDK完成
public void process(Message message, ModelMap modelMap) { boolean isSuccess=true; if(message==null || (!config.getAppId().equalsIgnoreCase(message.getAppId()))){ isSuccess=false; } String bizContent="<success>"+String.valueOf(isSuccess)+"</success>"+"<biz_content>" +customerPublicKey+"</biz_content>"; String signResult = AlipaySignature.encryptAndSign(bizContent, alipayPublicKey, customerPrivateKey, AlipayConstants.CHARSET_GBK, false, true); modelMap.put("signResult", signResult); }
config.getAppId() 为商户AppID, 可以在公众账号平台上查询, 是一个数字ID; customerPublicKey为上一节中生成的商户RSA公钥, customerPrivateKey为上一节中生成PKCS#8编码的商户私钥。
signResult 就是准备好的返回给支付宝公众账号平台的XML结果。 AlipaySignature.encryptAndSign 函数会自动拼装反馈XML结果。 两个boolean参数, 表示是否加密, 是否加签。
准备好反馈字符串之后, 还要注意一下细节
public void doPost(ModelMap modelMap, WebRequest request,HttpServletResponse response){ // .... 此处略去前面提的生成XML反馈细节 //要注意设置反馈的HTTP 请求的Head指定为XML格式, 否则XML中的特殊字符会当做HTML发生转义, 造成支付宝公众账号平台无法识别。 response.setHeader("Content-Type", "application/xml"); try { if(modelMap.containsAttribute("signResult")){ logger.warn("Response: "+(String)modelMap.get("signResult")); response.getOutputStream().print((String)modelMap.get("signResult")); } response.getOutputStream().flush(); } catch (IOException e) { logger.error("Write Response Error", e); } }
- 支付宝公众账号商户网关的搭建, RSA密钥对生成
- 支付宝公众账号商户网关的搭建, RSA密钥对生成
- openssl生成支付宝与易宝支付需要的RSA密钥对
- 如何生成支付宝RSA密钥
- 生成RSA密钥对
- RSA、DSA密钥对的生成
- 微信公众账号支付商户接入指南
- 微信公众账号支付商户接入指南
- RSA密钥的生成
- OpenSSL 生成RSA密钥对
- 微信支付 商户API密钥key的生成与设置
- [iOS开发]日常需求五:MAC生成支付宝的RSA密钥
- RSA - Java编程:生成RSA密钥对
- 关于支付宝开放平台RSA密钥的导入方法
- 用CSP生成RSA密钥对
- 使用python生成rsa密钥对
- 通联互联网支付网关商户接口技术规范
- iOS客户端 支付宝支付 (密钥生成)
- 初学Java,内部类(十九)
- ThinkPHP的增、删、改、查
- leetcode: Search for a Range
- IOS私有API的了解
- 董西成:Hadoop将在高速发展和完善中扩大优势!
- 支付宝公众账号商户网关的搭建, RSA密钥对生成
- 普通电脑做服务器,低配置不是问题,问题是如何发布网站应用到互联网
- 数据格式之解析Json
- (已解决)sublime text 写程序build后提示can't find '__main__' module in ' '
- excel 教程
- ubuntu开启SSH服务
- Ubuntu虚拟机搭建HDFS时常遇到的问题及相关解决办法
- haproxy配置详解
- JavaScript 操作JSON CRUD操作