作者:孤独秀风_328 | 来源:互联网 | 2023-10-17 18:23
这个教程可以用作了解扫码支付的整体运行过程,已经实现了前端扫码,记录订单,回调等一套完整的微信扫码支付。
相关链接:
微信支付开发:https://pay.weixin.qq.com/index.php/core/home/login?return_url=%2F
微信扫码支付开发文档: https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1
微信支付java Sdk:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1
微信支付相比支付宝而言。是比较多坑的。文档也没有很详细,但是 其实所有东西微信都已经给了,就是组件都给了,但是没有说明使用方式。网上的教程有新也有旧,其实核心代码已经不需要自己实现了。
前期准备:
1.先申请商户号,以下是必要参数
2.下载SDK https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1
虽然官网有写包含demo 其实只有sdk,是不能直接运行的,代码不算太难,稍微看一下,也大概知道sdk写的是什么了
如果要测试回调,请自行准备一个可以连接外网的服务器,或者使用花生壳(这个还没测试过)
主要流程
用户->点击商品->后端生成二维码地址返回给前端->用户支付->微信通知用户支付成功(调用我们写的回调地址)->通知后端支付成功
比较坑的地方
1.sdk中需要自己实现 WXPayConfig 类,而WXPayConfig 类有一个getWXPayDomain方法需要这样实现
2.回调不成功的情况
这是因为回调的时候编码是MD5,但是sdk里面默认是HMACSHA256,所以会出现一直验证不对的情况
改成这样即可
回调相关文档:
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_7&index=8
回调接口开发要注意两点
1、商户系统对于支付结果通知的内容一定要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏导致出现“假通知”,造成资金损失。
2、当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
这两点一定要做到,不然会出现数据问题,相关实现demo代码可作参考
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
其实微信支付不算太难,文档比较散乱,第一次可能会比较混乱,但是逻辑理清楚就比较简单了。自己需要的实现的只是业务相关逻辑,和相关订单数据保存
以下是我的demo文档可以作为参考。
码云地址:https://gitee.com/minstrel01/wxpay_demo.git
如果只是想单纯的看微信支付的代码,不管相关业务逻辑
只需要看WXPayServiceImpl 这个类,只要有这个类就可以实现支付,查询和回调
从码云下载好代码后,只需要执行sql文件和写入wxpay-dev.properties相关参数就可以运行了。
因为微信支付没有扫码回调相关功能。所以前端是用了定时调用查询订单是否成功支付(感觉有点蠢),但是看其他网站(例如花生壳微信支付页也是用前端定时器) 如果有更好的方法请告诉我。