https://cshall.alipay.com/enterprise/help_detail.htm?help_id=473890

http://wenku.baidu.com/link?url=Wnr_8Qo2rgghWyExknCdL7JTTQJigcGGTn7paW_gq7EdZEz33X72OVExFsEpbnDQpP76DymM4IdmWVqKTWl8mJm2aEcfOBT-iK3bOhRLe0q

支付宝公众账号商户网关的搭建, RSA密钥对生成

支付宝的公众账号文档地址 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

文档中忽略了一些细节, 本文进行如下一些细节补充。

支付宝常见问题

http://blog.csdn.net/woaifen3344/article/details/42487115

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
去掉头和换行, 公密钥对即可使用了。注意私钥是使用PKCS#8编码的版本。

“去掉头和换行” 举例, 例如公钥如下

yulong$ more rsa_public_key.pem
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnlK8+l+YnhRd0SM9p/D2zhxAw
sB9Zpt+mDlyyTSLwYPiBhmhemIvkPYHxllQrTop2GnNr4QuF2tGAw/ds5E5G+GGs
EshN1F5R6rIN2eKk59/nV4f7jzVkV+iq+KfTg8MYAn76PtBUK7TyahnBX4U3Umus
QGiCIhUyJpCOKrq5EQIDAQAB
-----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);
}
}

最新文章

  1. cisco-log
  2. MVC学习笔记----缓存
  3. 用avalon实现一个完整的todomvc(带router)
  4. MYSQL中&#39;TYPE=MyISAM&#39;错误的解决方案
  5. sublime 3
  6. file_get_contents高級用法
  7. vijos 1037 ***
  8. linux与windows的文本文件之间的转换
  9. ossim系统原理与实践
  10. spring aop通过joinpoint传递参数
  11. Web前端开发实用的Chrome插件
  12. Swiper使用方法
  13. Java随机数和UUID
  14. Linux多线程编程——线程的同步
  15. 关于SVD
  16. epoll的ET和LT模式
  17. HNOI2017大佬
  18. Android实现电话录音功能
  19. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.
  20. [转]Reporting Service部署之访问权限

热门文章

  1. thinkcmf报错:fileowner(): stat failed for /sys
  2. 页面自动执行(加载)js的几种方法
  3. python基础---内置函数 和 匿名函数 知识点自查填空题
  4. SpringData初探
  5. ongl与Struts标签
  6. int 13h,磁盘中断
  7. 64位电脑上安装MySQL进行MFC开发的相关问题
  8. maximum clique 1
  9. Effective Modern C++ 条款4:掌握查看型别推导结果的方法
  10. 关于node中 require 和 ES6中export 、export default的总结