支付宝打造公共账号业务网关, RSA密钥对生成

作者: 玉龙      版权全部,同意转载。 请注明出处(创建金融_玉龙
 
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);
        }
    }

加入标签

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

时间: 2024-10-13 04:34:19

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

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

作者: 玉龙      版权所有,允许转载, 请注明出处(创建金融_玉龙  http://www.weibo.com/u/1872245125) 支付宝的公众账号文档地址 http://open.alipay.com/index.htm 要开通支付宝的公众账号第一步就是要验证商户网关和开发者公钥的有效性. https://openhome.alipay.com/doc/docIndex.htm?url=https://openhome.alipay.com/doc/viewKbDoc.htm?k

微信公共账号学习笔记 _ 感想 爪机码字

昨晚看了下微信公共账号的资料,做了个小东西,以下是第一时间的感受.估计好多看法是错的,逐渐纠正吧. 1.输入方式 微信公共账号有如下几种获得输入的方式:用户被动接收.从菜单选择.用户发送文字.用户拍照发送.用户发送地理位置(从文档看这个是被动的).用户扫二维码.用户发语音.跳到定制页面上点击或输入. 把手机优势利用得很充分.没大屏没键盘的特点也鲜明. 做辅助应用可r以.做手机互联网入口也可以.做主干应用,力不从心. 自然语言处理还是王道! 目前文本交流也就限于dos式命令输入和当google搜索

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

摘要 在数据安全上rsa起着非常大的作用,特别是数据网络通讯的安全上.当异构系统在数据网络通讯上对安全性有所要求时,rsa将作为其中的一种选择,此时rsa的互通性就显得尤为重要了. 本文参考网络资料,提供了rsa互通性的一种可行的解决方案(c#,java,php),而这种互通性是在一定的局限性上达成的,比如密钥是1024位的(更高位没试过,应该也可行),基于PKCS1填充方式. 所编写的代码有一部分使用了硬编码,同时注重了功能的实现,在类结构设计上关注不多,有需要的可自行修改重构. 相关的程序集

保存openssl中RSA密钥对

标准的openssl生成的证书的顺序是 : [OpenSSL 测试程序: https://github.com/qianguozheng/datastructure] 如下是生成密钥对, 根据密钥并且分别保存密钥对的私钥,与公钥. 经过测试, 密钥对中的私钥可以提取出公钥, 我对其密钥不是很了解,通过测试发现是可以的. 不知道谁可以讲述下. /* 产生RSA密钥 */ RSA *rsa = RSA_new(); BIGNUM* e = BN_new(); /* 设置随机数长度 */ BN_set

基于Golang打造的开源WAF网关

基于Golang打造的开源WAF网关 Github地址 https://github.com/Janusec/janusec 产品介绍 https://mp.weixin.qq.com/s/OOA9LwPE0ulBqkIFkXax-Q 构建可扩展的应用安全基础设施 Janusec应用网关(Janusec Application Gateway),提供WAF (Web Application Firewall, Web应用防火墙).统一Web化管理入口.证书私钥保护,Web路由以及可扩展的负载均衡

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

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

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

目录 前言 统一鉴权 服务限流 路由转发 参数重组 链路跟踪 熔断降级 服务计次 业务指标监控 日志记录 迭代更新 总结 前言 对于API网关,业界貌似对它进行下划分,有下面几个分类/场景. 面向Web App 面向Mobile App 面向Partner OpenAPI 面向Partner ExternalAPI 其他... 在18年8月份的时候,有幸用.NET Core 2.1重构了一个对外的业务网关项目,这个项目的作用其实就是将公司内部能提供的数据能力公开出来,可以让有需要的公司使用. 这

Windows下RSA密钥生成工具openssl

点击下载 1. 生成原始 RSA私钥文件 private_key.pem openssl genrsa -out private_key.pem 1024 2. 将原始 RSA私钥转换为 pkcs8格式 openssl pkcs8 -topk8 -inform PEM -in private_key.pem -outform PEM -nocrypt -out rsa_private_key.pem 3. 生成 RSA公钥 rsa_public_key.pem openssl rsa -in p

PHP实现RSA签名生成订单功能【支付宝示例】

//组合签名 $a=time(); $b=substr($a, 1); //生成随机订单号 $orderid= $b.mt_rand(10000,99999); //合作身份者id,以2088开头的16位纯数字 $mygoods['partner']="2088011744308664"; //商家账号 $mygoods['seller']="2088011744308664"; //订单号 $mygoods['out_trade_no']=$orderid; //