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


    作者: 玉龙      版权全部,同意转载。 请注明出处创建金融_玉龙  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
    去掉头和换行, 公密钥对就可以使用了。

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

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

  • 相关阅读:
    2018 蓝桥杯省赛 B 组模拟赛(一)-年龄
    在win10系统下安装和卸载Ubuntu系统(为了搞双系统)的各种办法
    2018 CCPC 中国大学生程序设计竞赛-网络选拔赛 1004(D题 )Find Integer(三角函数+费马大定理)
    HDU(杭州电子科技大学) 2614 Beat (BFS写法)
    SQL server用到的SQL语句备份下
    【SQL Server】SQL触发器经验详解
    SQL SERVER 语句大全
    sqlserver 触发器实例代码
    触发器deleted 表和 inserted 表详解
    SQL server触发器中 update insert delete 分别给写个例子被。
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4741771.html
Copyright © 2020-2023  润新知