资讯专栏INFORMATION COLUMN

微信公众号开发中的支付流程

苏丹 / 3124人阅读

摘要:今天聊一下微信公众号开发在授权网页中的支付流程。前端获得签名后,再请求微信服务器,下面的支付流程就可以继续下去了。

今天聊一下微信公众号开发在授权网页中的支付流程。

微型公众号开发有以下几个步骤:
1.获取全局access_token
2.获取网页授权的access_token和refresh_token
3.获取网页授权的签名(前端用于获取调用JSSDK的权限)
4.公众号支付-调用统一下单接口获取prepay_id
5.公众号支付-将签名返回给前端用于请求微信公众号支付

其中步骤1、2根据微信开发文档很容易完成;第3步就开始用到签名了,这一步的签名相对来说比较好做;第4、5步微信支付中的签名对第一次做微信支付开发的小伙伴来说就有点麻烦了。

下面从第3步开始说吧。

第3步:获取网页授权的签名,前端调用JSSDK时,需要使用这个签名。
这一步骤中,我们需要给前端返回如下数据(除jsApiList):
):

wx.config({
    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    appId: "", // 必填,公众号的唯一标识
    timestamp: , // 必填,生成签名的时间戳
    nonceStr: "", // 必填,生成签名的随机串
    signature: "",// 必填,签名
    jsApiList: [] // 必填,需要使用的JS接口列表
});

其中,signature是一个关键的参数。生成签名的规则可以去这里 https://mp.weixin.qq.com/wiki... 的 附录1-JS-SDK使用权限签名算法 中查看
生成签名的代码如下:

def post(self, request):
        url = request.data["url"]
        logger.debug("url:%s", url)
        # 权限验证配置信息
        platform_info = {"appId": WXConfig.APPID, "timestamp": 0, "nonceStr": "", "signature": ""}

        # 时间戳
        timestamp = int(time.time())
        # 随机字符串,改方法自己实现即可
        noncestr = ToolToken.generate_noncestr()
        # jsapi_ticket
        ticket = cache.get("jsapi_ticket")
        if not ticket:
            # 重新获取jsapi_ticket
            wx = WXToken()
            # 此处根据说明文档获取jsapi_ticket即可
            wx.get_jsapi_ticket()

        logger.debug("ticket:%s", ticket)
        # 组合字符串,其中url是需要前端传给我们的
        info_string = "jsapi_ticket=" + ticket + "&noncestr=" + noncestr + "×tamp=" + str(timestamp) + "&url=" + url

        signature = hashlib.sha1(info_string.encode("utf-8")).hexdigest()
        platform_info["signature"] = signature
        platform_info["timestamp"] = timestamp
        platform_info["nonceStr"] = noncestr
        return Response(platform_info, status=status.HTTP_200_OK)

第4步:从这一步就开始调用微信支付的相关接口了。这里一定要注意,调用微信支付接口时,一定要看最新的说明文档,不要看旧的,不然会出现错误,并且不容易找到原因。
调用统一下单接口的代码如下:

async def unify_order(self):
        """
        请求微信统一下单接口
        :return:
        """
        url = "https://api.mch.weixin.qq.com/pay/unifiedorder"
        headers = {"Content-Type": "application/xml"}
        async with ClientSession() as session:
            async with session.post(url=url, data=self.xml_data, headers=headers) as res:
                ret = await res.text()
                logger.debug("ret:%s", ret)
                self.unify_order_data = self.xml_to_dict(ret)
                logger.debug("self.unify_order_data:%s", self.unify_order_data)

其中,self.xml_data内容如下:


    你的appid
    pay
    paytest
    商户号
    apple
    你生成的随机字符串
    通知地址
    你的openid
    订单号
    外网可访问ip地址
    订单金额
    JSAPI
    MD5
    签名

其中最后一个参数sign的值是需要通过其他参数加密得到的,签名生成规则可以参考微信官方文档。这里需要说明一下,一定要加上sign_type这个参数(虽然官网说明文档中把这个参数标记为不是必须的),显式指定加密方法,不然可能得到签名错误的结果。

上面xml中的参数可以根据需求添加。

请求成功后,会返回prepay_id这个值,在下一步中会用到。返回结果可能如下:

{"return_code": "SUCCESS", "return_msg": "OK", "appid": appid, "mch_id": 商户号, "nonce_str": 随机字符串, "sign": 签名, "result_code": "SUCCESS", "prepay_id": prepay_id, "trade_type": "JSAPI"}

第5步:这一步中需要将以下信息返回个前端:

wx.chooseWXPay({
    timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
    nonceStr: "", // 支付签名随机串,不长于 32 位
    package: "", // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
    signType: "", // 签名方式,默认为"SHA1",使用新版支付需传入"MD5"
    paySign: "", // 支付签名
    success: function (res) {
        // 支付成功后的回调函数
            }
        });

除了success,其他参数都需要返回给前端。从 timestamp到paySign这几个参数中,最难处理的又是签名paySign。当你看到上面那段js代码时,可能你看到的文档已经过时了,有可能误导你。生成签名给前端时可能只使用了timestamp,nonceStr,package,signType这几个参数,但是你将这样生成的名返回前端时,前端请求后可能得到签名认证错误的提示。

正确的签名生成方式是timestamp,nonceStr,package,signType和key(微信商户平台配置的key)都需要参与签名;并且package的值不是第4步中返回的prepay_id的值,而是”prepay_id=”+prepay_id这样一个字符串。具体如下:

appId=${appid}&nonceStr=${nonceStr}&package=prepay_id=${prepay_id}&signType=MD5&timeStamp=${timeStamp}&key=${key}

将上面的字符串加密即可获得paySign的值。
前端获得签名后,再请求微信服务器,下面的支付流程就可以继续下去了。

以上如有错误之处,欢迎交流指正!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42401.html

相关文章

  • 浅析微信支付微信支付简单介绍(小程序、公众、App、H5)

    摘要:本文是浅析微信支付系列文章的第二篇,主要讲解一下普通商户接入的支付方式以及其中的不同之处。浅析微信支付前篇大纲微信支付是集成在微信客户端的支付功能,用户可以通过手机完成快速的支付流程。目前微信支付支持手机系统有苹果安卓和。 本文是【浅析微信支付】系列文章的第二篇,主要讲解一下普通商户接入的支付方式以及其中的不同之处。 上篇文章讲了本系列的大纲,没有看过的朋友们可以看一下。 浅析微信支...

    shadowbook 评论0 收藏0
  • 微信公众支付开发全过程(java版)

    摘要:一微信官方文档微信支付开发流程公众号支付首先我们到微信支付的官方文档的开发步骤部分查看一下需要的设置。配置微信公众账号支付配置支付类所有方法都在这个类里发起支付微信公众账号支付订单异步回调这就是这个所说的行代码解决微信支付。 文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源。 一、微信官方文档微信支付开发流程(公众号支付) 首先我...

    Shimmer 评论0 收藏0
  • 浅析微信支付支付验收示例和验收指引

    摘要:本文是浅析微信支付系列文章的第十一篇,主要讲解支付验收示例和验收指引。为保证商户接入质量,提升交易安全及用户体验,微信支付的合作服务商在正式上线交易前,必须先根据本文指引完成验收。 本文是【浅析微信支付】系列文章的第十一篇,主要讲解支付验收示例和验收指引。 浅析微信支付系列已经更新十一篇了哟~,没有看过的朋友们可以看一下。 浅析微信支付:如何使用沙箱环境测试 浅析微信支付:下载对账单...

    Cympros 评论0 收藏0
  • 浅析微信支付:前篇大纲

    摘要:浅析微信支付前篇大纲本文是浅析微信支付系列文章的第一篇,主要会介绍一下为何写下这个系列以及对于微信支付的一点小经验,与君共勉。下面讲一下我是如何去学习微信支付的。 浅析微信支付:前篇大纲 本文是【浅析微信支付】系列文章的第一篇,主要会介绍一下为何写下这个系列以及对于微信支付的一点小经验,与君共勉。 以下会分几个步骤讲一下我学习微信支付的过程,也是一部辛酸史,也是希望朋友们不要再次跌进...

    mayaohua 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<