微信JSAPI支付签名算法(附通用代码)

签名算法

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

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

特别注意以下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段

第二步,在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签名方式

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

<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>

贴上我的通用代码:

不管是验证调用返回或微信主动通知签名时,只要将所有发送或者接收到的数据传入函数(当然接收到的签名(sign)不能传入),即可得到签名.同时当微信接口可能增加字段时,完美支持增加的扩展字段.

from hashlib import md5, sha1
def get_sign(kwargs, sign_type='MD5', pay_sign_key=None, is_upper=True):
    """
    微信签名参数组装
    @param: kwargs  参与签名的参数  dict类型
    @param: sign_type 签名类型
    @param: pay_sign_key 是否需要支付密钥
    @return: sign, sign_type
    """
    # 根据ascii码进行排序
    params = list(kwargs.items())
    params.sort()
    # url拼接
    string = "&".join(["%s=%s" % (str(p[0]), str(p[1])) for p in params])
    if pay_sign_key:
        string += "&key=%s" % pay_sign_key

    string = bytes(string, "UTF-8")
    # 生成签名 Point: 这里签名时间戳,必须与wxconfig中得时间戳一致
    sign = ""
    if sign_type == "MD5":
        sign = md5(string).hexdigest().upper() if is_upper else md5(string).hexdigest()
    if sign_type == "SHA1":
        sign = sha1(string).hexdigest().upper() if is_upper else sha1(string).hexdigest()
    # sign为签名,sign_type为签名类型
    return sign, sign_type
    
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 微信JSAPI支付是一种使用微信内置浏览器或微信客户端内的网页进行支付的方式。流程如下: 1. 用户在商户的网站或应用内点击支付按钮,触发支付请求。 2. 商户服务器收到支付请求后,向微信支付服务器发起下单请求,并将支付信息传递给微信支付服务器。 3. 微信支付服务器收到下单请求后,会根据商户提交的信息生成支付二维码或支付链接。 4. 商户服务器收到微信支付服务器的响应后,将支付二维码或支付链接发送给用户浏览器。 5. 用户浏览器打开支付二维码或支付链接,跳转到微信内置浏览器或微信客户端进行支付。 6. 用户在微信内置浏览器或微信客户端内输入支付密码或通过其他认证方式进行支付。 7. 微信支付服务器收到用户的支付信息后,会向商户服务器发送支付通知。 8. 商户服务器收到支付通知后,会对订单进行处理,并向用户 ### 回答2: 微信JSAPI支付是指通过微信公众号或小程序内的网页调用微信支付接口实现支付功能的流程。 1. 用户点击支付按钮后,公众号或小程序调用微信支付接口向微信服务器发起支付请求。 2. 微信服务器返回预支付交易会话标识prepay\_id给公众号或小程序。 3. 公众号或小程序将prepay\_id和其他支付参数通过JSAPI方式传递给前端页面。 4. 前端页面通过微信JSAPI提供的支付接口,调用微信客户端进行支付。 5. 用户在微信客户端确认支付后,微信服务器会将支付结果通知给公众号或小程序服务器。 6. 公众号或小程序服务器接收到支付结果通知后,进行订单处理,更新订单状态。 7. 公众号或小程序服务器向微信服务器返回处理结果,微信服务器会将处理结果通知给微信客户端。 8. 微信客户端收到支付结果通知后,提示支付成功或失败,并跳转至指定页面。 整个过程中,涉及到的主要步骤有:发起支付请求、获取预支付交易会话标识、传递参数给前端、调用微信客户端支付、接收支付结果通知、处理订单、返回处理结果给微信服务器、微信客户端显示支付结果。 微信JSAPI支付能够为公众号或小程序提供方便、安全的支付体验,使用户能够快速完成支付操作,同时也提供了支付结果的即时通知和订单处理的接口,方便商户进行后续操作。 ### 回答3: 微信JSAPI支付流程是指通过微信公众号或小程序内页面上的网页进行支付的流程。具体流程如下: 1. 用户在微信公众号或小程序内选择商品并确认下单。 2. 商户服务器将订单信息提交给微信服务器,包括商品描述、订单号、金额等信息,并生成预支付交易会话标识prepay_id。 3. 商户服务器将prepay_id返回给前端页面。 4. 前端页面调用微信JSAPI的支付接口,传入prepay_id以及其他支付相关参数(如时间戳、随机字符串等)。 5. 微信服务器校验参数,并生成支付签名。 6. 微信服务器将支付签名返回给前端页面。 7. 前端页面调用微信JSAPI的支付接口,传入支付签名以及其他支付相关参数。 8. 用户在微信客户端确认支付并输入支付密码。 9. 微信服务器接收支付结果,并返回给商户服务器。 10. 商户服务器校验支付结果,更新订单状态,并返回相应的支付结果给用户。 需要注意的是,为了确保支付的安全性,商户服务器需要对支付结果进行校验,并对订单状态进行更新,以防止重复支付支付金额被修改等情况的发生。 以上就是微信JSAPI支付的主要流程。微信JSAPI支付相对于其他支付方式来说,使用便捷,支持在微信内进行快速支付,适用于微信公众号和小程序等场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值