zoukankan      html  css  js  c++  java
  • 判断逻辑 先判断协议字段返回,再判断业务返回,最后判断交易状态 API密钥

    【微信支付】微信小程序支付开发者文档 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=4_1

    协议规则

    商户接入微信支付,调用API必须遵循以下规则:

    表4.1 接口规则

    传输方式 为保证交易安全性,采用HTTPS传输
    提交方式 采用POST方法提交
    数据格式 提交和返回数据都为XML格式,根节点名为xml
    字符编码 统一采用UTF-8字符编码
    签名算法 MD5,后续会兼容SHA1、SHA256、HMAC等。
    签名要求 请求和接收数据均需要校验签名,详细方法请参考安全规范-签名算法
    证书要求 调用申请退款、撤销订单接口需要商户证书
    判断逻辑 先判断协议字段返回,再判断业务返回,最后判断交易状态

     【微信支付】微信小程序支付开发者文档 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=4_3

    1、签名算法

    (签名校验工具)

    签名生成的通用步骤如下:

    第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

    特别注意以下重要规则:

    1. ◆ 参数名ASCII码从小到大排序(字典序);
    2. ◆ 如果参数的值为空不参与签名;
    3. ◆ 参数名区分大小写;
    4. ◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
    5. ◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段

    第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。

    ◆ key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置

    举例:

    假设传送的参数如下:

    appid: wxd930ea5d5a258f4f

    mch_id: 10000100

    device_info: 1000

    body: test

    nonce_str: ibuaiVcKdpRxkhJA

    第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:

    stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";

    第二步:拼接API密钥:

    stringSignTemp=stringA+"&key=192006250b4c09247ec02edce69f6a2d" //注:key为商户平台设置的密钥key

    sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7" //注:MD5签名方式

    sign=hash_hmac("sha256",stringSignTemp,key).toUpperCase()="6A9AE1657590FD6257D693A078E1C3E4BB6BA4DC30B23E0EE2496E54170DACD6" //注:HMAC-SHA256签名方式

    最终得到最终发送的数据:

    <xml>

    <appid>wxd930ea5d5a258f4f</appid>

    <mch_id>10000100</mch_id>

    <device_info>1000</device_info>

    <body>test</body>

    <nonce_str>ibuaiVcKdpRxkhJA</nonce_str>

    <sign>9A0A8659F005D6984697E2CA0A9CF3B7</sign>

    </xml>

    2、生成随机数算法

    微信支付API接口协议中包含字段nonce_str,主要保证签名不可预测。我们推荐生成随机数算法如下:调用随机数函数生成,将得到的值转换为字符串。

    开放平台文档中心 https://docs.open.alipay.com/291/105974

    第三步:使用应用私钥生成请求签名

    简而言之,签名的过程即生成签名方(通常为支付宝客户端)将传送的消息用私钥加密的过程;验签则是指验签方(通常为开放平台的服务端)使用公钥对消息进行验证的过程。

    以 JAVA 语言为例,签名和验签的过程大致为:

    1. 生成签名方(通常为支付宝客户端)首先对参数放入一个字符串数组 signFields,把参数和值放入一个对象或 map 中,使用 JSONObject 把这个对象转化成 json 对象。然后构建签名原文,在构建签名原文时,我们需把参数按照字典(比如a,b,c)顺序排序,具体排序方法直接调用 JAVA 的 Arrays.sort 方法。 然后使用 RSA 的私钥对签名原文进行签名。

    2. 验签方(通常为开放平台的服务端):和生产签名方一样先生成签名原文,然后使用 RAS 的公钥生成签名方传入的签名,把签名原文对生成签名方闯入的签名进行验证,验证结果为 true 则说明验证成功,否则未通过。

    支付宝开放平台 SDK 封装了签名和验签过程,只需配置账号及密钥参数即可,强烈建议使用。

     签名机制_HTTP调用方式_API参考_云服务器 ECS-阿里云 https://help.aliyun.com/document_detail/25492.html

     
  • 相关阅读:
    SpringMVC Failed to instantiate [java.util.List]: Specified class is an interface
    github上项目直接在浏览器页面像VS Code一样查看代码
    springboot+dubbo整合swagger-ui+swagger-dubbo
    petalinux非离线模式build卡死在u-boot编译问题
    SystemC使用示例
    使用chisel做数字电路开发的Hello World
    lmgrd在Linux系统上的配置
    FFmpeg libswscale源码分析3-scale滤镜源码分析
    FFmpeg libswscale源码分析2-转码命令行与滤镜图
    FFmpeg libswscale源码分析1-API介绍
  • 原文地址:https://www.cnblogs.com/rsapaper/p/9746734.html
Copyright © 2011-2022 走看看