获取平台证书V2接口文档V1.0,获取平台证书

加密文件 8
V2接口文档V1.0 第一章文档历史 修订日期2018/09/29 修订内容创建 修订版本V1.0 修订人Leongui、Davytan 第二章引言 2.1文档范围 文档涵盖以下内容:使用场景介绍接口规范案例介绍接口输入、输出参数错误码 2.2预期读者 微信支付-小微接口开发的所有产品、开发、测试及相关审批者。
第三章接口规范 3.1接口调用规则 认证方式:HTTPS认证,退款和撤销接口调用需要商户证书(证书在审核邮件附件中,或者在商户平台---api安全下载) 请求采用POST方式提交和返回结果采用XML格式字符集默认使用UTF-
8,请勿使用其它字符集商户与微信之间的交互(特别是Native回调和支付通知回调),都需要验证签名处理返回时先判断协议返回错误码,再判断业务返回错误码,最后判断交易状态 3.2Sign签名生成方法(签名工具) 微信支付中将对数据里面的内容进行鉴权,确定携带的信息是真实、有效、合理的。
因此,这里将定义生成sign字符串的方法。
以MD5签名为例:a.对所有传入参数按照字段名的ASCII码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1,注意:值为空的参数不参与签名;b.在string1最后拼接上key=Key(商户支付密钥)得到stringSignTemp字符串,并对stringSignTemp进行md5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
下面定义了一段生成sign字符串的示范过程: 假设以下为package传入参数:appid=wxd930ea5d5a258f4fauth_code=123456body=testdevice_info=123 mch_id=1900000109nonce_str=960f228109051b9969f76c82bde183acout_trade_no=1400755861spbill_create_ip=127.0.0.1sub_mch_id=124total_fee=1key=8934e7d15453e97507ef794cf7b0519di:经过a过程URL键值对字典序排序后的字符串string1为:appid=wxd930ea5d5a258f4f&auth_code=123456&body=test&device_info=123&mch_id=1900000109&nonce_str=960f228109051b9969f76c82bde183ac&out_trade_no=1400755861&spbill_create_ip=127.0.0.1&sub_mch_id=124&total_fee=1ii:经过b过程后得到sign为:sign=md5(string1&key=8934e7d15453e97507ef794cf7b0519d).toUpperCase=md5(appid=wxd930ea5d5a258f4f&auth_code=123456&body=test&device_info=123&mch_id=1900000109&nonce_str=960f228109051b9969f76c82bde183ac&out_trade_no=1400755861&spbill_create_ip=127.0.0.1&sub_mch_id=124&total_fee=1&key=8934e7d15453e97507ef794cf7b0519d).toUpperCase()="c380bec2bfd727a4b6845133519f3ad6".toUpperCase()="C380BEC2BFD727A4B6845133519F3AD6"更加详细的说明参见:签名生成算法 第四章获取平台证书V2接口 4.1使用场景 ※调用获取平台证书V2接口之前,请前往微信支付商户平台升级API证书,升级后才可成功调用本接口。
详见:API证书升级指引 4.2获取平台证书V2接口 4.2.1请求规则 请求Url /risk/getcertficates 是否需要证书 否 请求方式 POST、XML 签名方式 HMAC-SHA256 4.2.2输入参数 必 名称 变量名 类型 示例值 描述 填 商户号 mch_id 是String(32) 1900000109 微信支付分配的商户号 随机字符串 nonce_str 是String(32) 5K8264ILTKCH16CQ2502SI8ZNMTM67VS 随机字符串,不长于32位。
推荐随机数生成算法 签名 sign 是String(64) C380BEC2BFD727A4B6845133519F3AD6C380BEC2BFD727A4B6845133519F3AD6 签名,详见签名生成算法 签名方式 sign_type 是String(32) HMAC-SHA256 暂只支持HMAC-SHA256 举例如下: HMAC-SHA256abcdef1900006511FD29B578B31C509B45B7C2779803D9E41B68E6B84AEB1EBDE47DCA00049B649B 4.2.3返回结果 名称 返回状态码 变量名 必类型 填 示例值 return_code 是String(16) SUCCESS 描述 SUCCESS/FAIL此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断 返回信息 return_msg 否String(128) 签名失败 返回信息,如非空,为错误原因签名失败参数格式校验错误 当return_code为SUCCESS的时候,还会包括以下字段: 名称 变量名 必类型 填 示例值 描述 商户号随机字符串 签名 mch_idnonce_str sign 是String(32) 是String(32) 是String(64) 1900000109 5K8264ILTKCH16CQ2502SI8ZNMTM67VS C380BEC2BFD727A4B6845133519F3AD6C380BEC2BFD727A4B6845133519F3AD6 调用接口提交的商户号微信返回的随机字符串 微信返回的签名,详见签名生成算法 业务结果 result_code 是String(16) SUCCESS SUCCESS:支付成功 FAIL:根据err_code的指引决定下一步操作。
错误代码 err_code 否String(32) SYSTEMERROR 详细参见错误列表 错误代码描述 err_code_des 否String(128) 系统错误 错误返回的信息描述,详见收银员操作指引列表 当return_code和result_code都为SUCCESS的时,还会包括以下字段: 必 名称 变量名 类型 填 示例值 平台证书信息 certificates 是String(6000) 描述 包含了平台证书序列号serial_no、证书启用时间effective_time、证书弃用时间expire_time、加密证书信息包encrypt_certificate,请根据平台证书解密指引获取证书明文(证书明文为PEM格式),方可使用 举例如下: [CDATA[SUCCESS]]> [CDATA[OK]]> [CDATA[SUCCESS]]> [CDATA[PnDRNZSFzpp2ieUq]]> [CDATA[AD5919F5FE6D77C308ABEE1A4021CB9839C3F04D7C2FE68FC765011EA3BBEB0F]]>
[CDATA[1900006511]]> [CDATA[{"data":[{"serial_no":"42A5C4F7F70D57D0576BBEDA0E0928D6E5C4F003","eff
ective_time":"2017-08-1814:52:04","expire_time":"2022-08-1714:52:04","encrypt_certificate":{"algorithm":"AEAD_AES_256_GCM","nonce":"bfcb2bd59c97","associate
d_data":"certificate","ciphertext":"vQ4N+lLNvtIhaV5Gqao44mbYBSaz3bZ4Md3M4f+OuquEJrp+/v4gA//U
ZqnQ1G0roYqnSMfcsRFj7ItTCP0tbYregpYqBKd4NSLiF/m1o01JD/9nzd3pBwBUJenUzvE1cuMO+fookaBYr+Z5AfesXUUmvl5qAbD3Yj+4W6rls/W2YDo3o3T9sWtl5A/5w+U/Wsb9/UefNow6ND+2MAWRm1GK5tRTkBGVKMt699SM4p0pUns3D4g3slz6zeYIFY3+x+NzrxNq+Ov7I4e/pCvdEIrBmzzTKzmJ+qhHIRVpXqiMTtOWSpCcTCptUt4v/ZrIlMihESdruDv7Zj4984+4tzBqmQ/Mt1Bwbs8RyKYe2UufmXSMyOeCW06TtkXduZ7M2QSKE4kTlRerEGPatymglepMnjpSMX/CnwaSaHcIBWN2oNjAcuBdMGFlbv05owBlkEZm4sRgZR9EMDIX/N469TUsJ3yXVLuN2k6XaAEM5wpX/Hc15R1o1rhpnLjGZpZoKOVpmcyqw5/0uBQgAAaTXOGgr6L2mrSsp9Au4J0hIX/SjfrjaovXEZTvSM+1oGlJmRVLZ+jxjTD/al7X2xsjTleYYggp4EN4aaC4DTwUNcAAzhHF9R7e+bIfyopa2FF+exXC9kZUYLywg9bwKOJwhkykz7NM669gXLjlyEu6W9gIa8sa3HKSfeLfcpTan7Ev9BjRbowQYmn7RZEyvizKJHJU3ge04OImeJFY4fT8JahzaOT8BQnvP4g2ZT65r4jQwXEbFqOJNH5SdRlTL+3oCqkgMx+aj9ZKqxY9EFDwZgjLZWoySJvIbDQfEayo1pRzlcF9MbuFyGH0vblRLSx3viCc/q6oUkx2OjRw1Hp3sdtFGZMS2OE1+xICymLPglHuMzGkGYwl7ZxbotiXKkqAN46Zd7hNcTwHhxMjQXcoaUoGNEKK1fRZrBv0eUjhES8GbZvzS7+Xm1SR8dKTNMQyEvFesUY143nFt1GK+/bJR+0l2dz0zgpJGAS4yKBkWdsTng0a/jzRbMryRy+fAjWGfvHlVcXXD5b51kx1P3pxcQdMe3K0al+40gLilbegFUVPXhZ04BVgxiWHfeRPnDVwVXFzHG7MAjmPWS0PFzJupZExuy+jxIf5oyHLcYjnl2jwNNcWdzm5AFWYqy5oQI88lcOBx1X+fGuZTKAopk8/2zCa7uu9ILSyVBf801wagINDhxSNemoDoRPE0lvIYE/ax7RQehQ2Q3F2JNmpP6EfP1KZsT6nSWLBf1M5tvX/pAsPbYowNCgrwXLa68L5e03ScplSZrJWP7H3UcGxq9fRLgOYnF7ocRr0iviSRGVmSDqdtpIWwhb+UoAw4347hTQsEHRhYQdR6fTryiANB+H+6SnRJany/cozFV11J03w6h9Lmx95OJGYwF8Cei8S3pNkHpq90o7eUq2PmfS/wwxL3ZyJFPS8OY05zR4ykRnwir4L2X1RyCVoV34AAzVsvr93fVNPHtY3yf+i6sDWb4yGaXaYMM/cOnNs7wrxME44in+YZtPduI+8MZ5EGTbaqjJzrGnrbDnb515OOXg6gk+eV+bJkMXxxoNQGOkLCCI5pN+wrrokXRYhFZbYSkLd/rkg+T3JS23nO1TYOejewvatmQ97i9OFxNrwxOzDL9E87jLj26Wm+VSbm/SNafEh0eU0owwyVskg7evUe7XxcBErXC8M87MuK6AJo/IhhivYlEb/d+wG2r0gV7VesAjYC2n3ZAI1oz78WMMTmj6IqXgDc20uNmGYX0IEB+cxpJwejEfV72ArStqzumUzw3YhvD4L7Ozq0b6Y2gao88MONn9nevnydq5IvsG0bsGutXCFwjhYGxLyqigGIkVkXeq+BbxFpNxbogkB43cM"}}]}]]>
4.2.4平台证书解密指引 “加密后的证书内容”的解密算法:
1.从微信支付商户平台上获取商户的APIv3密钥,记为`key`
2.针对`algorithm`中描述的算法(目前为`AEAD_AES_256_GCM`),取得对应的参数`nonce`和`associated_data`。

3.使用`key`、`nonce`和`associated_data`,对数据密文`ciphertext`进行解密,得到平台证书的原文,
4.将原文写入文件,使用该文件对敏感字段进行加密。
注:`AEAD_AES_256_GCM`算法的接口细节,请参考rfc5116。
微信支付使用的密钥`key`长度为32个字节,随机串`nonce`长度12个字节,`associated_data`长度小于16个字节并可能为空。
很多编程语言支持`AEAD_AES_256_GCM`算法,如java语言中的Cipher、SecretKey、GCMParameterSpec、Base64等类。
(java与php代码示例如下)★以下代码为AEAD_AES_256_GCM的解密java示例代码,未经充分测试,仅供参考。
.qq.weixin.mch.api.examples;importjava.security.PublicKey;importjavax.crypto.Cipher;importjavax.crypto.spec.GCMParameterSpec;importjavax.crypto.spec.SecretKeySpec;importjavax.security.cert.X509Certificate;importjava.util.Base64;publicclassAesGcmExample2{ privatestaticfinalStringALGORITHM="AES/GCM/NoPadding";privatestaticfinalintTAG_LENGTH_BIT=128; privatestaticfinalintNONCE_LENGTH_BYTE=12;privatestaticfinalStringAES_KEY="";//APIv3密钥privatestaticfinalStringTRANSFORMATION_PKCS1Padding="RSA/ECB/PKCS1Padding";privatestaticStringaesgcmDecrypt(Stringaad,Stringiv,StringcipherText)throwsException{ finalCiphercipher=Cipher.getInstance(ALGORITHM,"SunJCE");SecretKeySpeckey=newSecretKeySpec(AES_KEY.getBytes(),"AES");GCMParameterSpecspec=newGCMParameterSpec(TAG_LENGTH_BIT,iv.getBytes());cipher.init(Cipher.DECRYPT_MODE,key,spec);cipher.updateAAD(aad.getBytes());returnnewString(cipher.doFinal(Base64.getDecoder().decode(cipherText)));} publicstaticvoidmain(String[]args){finalStringassociatedData="";//encrypt_certificate.associated_datafinalStringnonce="";//encrypt_certificate.noncefinalStringcipherText="";//encrypt_certificate.ciphertexttry{StringwechatpayCert=aesgcmDecrypt(associatedData,nonce,cipherText);}catch(Exceptione){e.printStackTrace();} }}★以下代码为AEAD_AES_256_GCM的解密php示例代码,未经充分测试,仅供参考。
//region证书解密start publicfunctiondecodePem(){$ciphertext='加密后的证书内容'; $nonce='加密证书的随机串,加密证书的随机串';$associated_data='加密证书的随机串,固定值:certificate';$key='你的APIv3密钥'; $check_sodium_mod=extension_loaded('sodium');if($check_sodium_mod===false){ echo'没有安装sodium模块';die;}$check_aes256gcm=sodium_crypto_aead_aes256gcm_is_available();if($check_aes256gcm===false){ echo'当前不支持aes256gcm';die;} $pem=sodium_crypto_aead_aes256gcm_decrypt(base64_decode($ciphertext),$associated_data,$nonce,$key); var_dump($pem);
//这是解密出来的证书内容,复制出来保存就行了}//endregion证书解密end

标签: #文件 #共享文件夹 #太大 #文件 #密码 #文件 #文件 #文件夹