作者: 玉龙      版权全部,同意转载。 请注明出处(创建金融_玉龙
 
http://www.weibo.com/u/1872245125

原文地址: http://blog.csdn.net/yehuijun/article/details/24780119

支付宝的公众账号文档地址 http://open.alipay.com/index.htm

要开通支付宝的公众账号第一步就是要验证商户网关和开发人员公钥的有效性。

key=236714_422556&type=info" class="external-link" rel="nofollow" style="color:rgb(0,109,175); text-decoration:none">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
去掉头和换行, 公密钥对就可以使用了。

注意私钥是使用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);
}
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

支付宝打造公共账号业务网关, RSA密钥对生成的更多相关文章

  1. rsa互通密钥对生成及互通加解密(c#,java,php)

    摘要 在数据安全上rsa起着非常大的作用,特别是数据网络通讯的安全上.当异构系统在数据网络通讯上对安全性有所要求时,rsa将作为其中的一种选择,此时rsa的互通性就显得尤为重要了. 本文参考网络资料, ...

  2. Java实现RSA密钥对并在加解密、加签验签中应用的实例

    一.项目结构 二.代码具体实现 1.密钥对生成的两种方式:一种生成公钥私文件,一种生成公钥私串 KeyPairGenUtil.java package com.wangjinxiang.genkey. ...

  3. linux+apache+mod_python+wechat_sdk搭建微信公共账号服务器

    linux+apache+mod_python+wechat_sdk搭建微信公共账号服务器 转载请注明本文原作者:FignerLiu PRE 最近尝试了下使用python搭建微信公共账号服务器,实现了 ...

  4. 一次业务网关用ASP.NET Core 2.1重构的小结

    目录 前言 统一鉴权 服务限流 路由转发 参数重组 链路跟踪 熔断降级 服务计次 业务指标监控 日志记录 迭代更新 总结 前言 对于API网关,业界貌似对它进行下划分,有下面几个分类/场景. 面向We ...

  5. 相约 DTCC 2021 | Tapdata 受邀分享:如何打造面向 TP 业务的数据平台架构

      2021第十二届中国数据库技术大会(DTCC)将于2021年10月18-20日,在北京国际会议中心举行,Tapdata 创始人唐建法受邀分享:如何打造面向 TP 业务的数据平台架构.   演讲时间 ...

  6. RSA密钥生成、加密解密、签名验签

    RSA 非对称加密公钥加密,私钥解密 私钥签名,公钥验签 下面是生成随机密钥对: //随机生成密钥对 KeyPairGenerator keyPairGen = null; try { keyPair ...

  7. ECDSA密钥对生成以及在Token中的应用

    1 概述 本文主要讲述了如何利用Openssl生成ECDSA密钥对,并利用Auth0库进行Token生成及验证的过程. 2 ECDSA 2.1 简介 ECC(Elliptic Curve Crypto ...

  8. RSA密钥生成与使用

    RSA密钥生成与使用 openssl生成工具链接:http://pan.baidu.com/s/1c0v3UxE 密码:uv48 1. 打开openssl密钥生成软件打开 openssl 文件夹下的  ...

  9. openssl-0.9.8k_WIN32(RSA密钥生成工具

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha openssl-0.9.8k_WIN32(RSA密钥生成工具

随机推荐

  1. perl学习(5) 输入和输出

    1.1. 从标准输入设备输入 <STDIN> 行输入操作在到达文件的结尾时将返回undef,在while循环的条件中不能使用chomp: while (defined($line = &l ...

  2. java学习之tcp与udp的实现

    package com.gh.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.Inp ...

  3. HDU4648+Easy

    N^2都能过!!!!!!! /* Easy */ #include<stdio.h> #include<string.h> #include<stdlib.h> # ...

  4. HDU 1862 EXCEL次序 (排序水问题)

    Problem Description Excel对能够记录一组由任意列排序指定.现在,请把你编译的代码类似特征.   Input 測试输入包括若干測试用例. 每一个測试用例的第1行包括两个整数 N ...

  5. [Swust OJ 465]--吴奶奶买鱼(0-1背包+dfs)

    题目链接:http://acm.swust.edu.cn/problem/465/ 还有一道题只是描述不一样,方法一模一样(http://acm.swust.edu.cn/problem/644/) ...

  6. ASP.NET MVC 5 学习教程:添加控制器

    原文 ASP.NET MVC 5 学习教程:添加控制器 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 通过 ...

  7. 如何自学 Python(干货合集)

    http://wenku.baidu.com/view/5108f974192e45361066f583.html

  8. Fruit Ninja(树状数组+思维)

    Fruit Ninja Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. G-Sensor 校准标准

    在桌面上水平平,自己的前表面. 此时Z轴应+值,和值至9.8大约,x.y轴应0值大约.它是平行于主体x轴,固定的左,提起右侧时,,x轴数值它应0开始增加.直到垂直时,+9.8大约. 为y轴.下面固定. ...

  10. typedef和define

    typedef int INT; #define INTPTR1 (int*) typedef是用来声明类型别名的,在实际编写代码过程使用typedef往往是为了增加代码的可读性. #define是一 ...