- 如何使用wechatpay-php基础能力来做支付通知对接
APIv3回调通知 从请求头部[代码]Headers[代码],拿到[代码]Wechatpay-Signature[代码]、[代码]Wechatpay-Nonce[代码]、[代码]Wechatpay-Timestamp[代码]、[代码]Wechatpay-Serial[代码]及[代码]Request-ID[代码],商户侧[代码]Web[代码]解决方案可能有差异,请求头可能大小写不敏感,请根据自身应用来定; 获取请求[代码]body[代码]体的[代码]JSON[代码]纯文本; 检查通知消息头标记的[代码]Wechatpay-Timestamp[代码]偏移量是否在5分钟之内; 调用[代码]SDK[代码]内置方法,构造验签名串然后经[代码]Rsa::verfify[代码]验签; 消息体需要解密的,调用[代码]SDK[代码]内置方法解密; 如遇到问题,请拿[代码]Request-ID[代码]点击这里,联系官方在线技术支持; 样例代码如下: [代码]use WeChatPay\Util\PemUtil; use WeChatPay\Crypto\Rsa; use WeChatPay\Crypto\AesGcm; use WeChatPay\Formatter; $inWechatpaySignature = '';// 请根据实际情况获取 $inWechatpayTimestamp = '';// 请根据实际情况获取 $inWechatpaySerial = '';// 请根据实际情况获取 $inWechatpayNonce = '';// 请根据实际情况获取 $inBody = '';// 请根据实际情况获取,例如: file_get_contents('php://input'); $apiv3Key = '';// 在商户平台上设置的APIv3密钥 // 根据通知的平台证书序列号,查询本地平台证书文件, // 假定为 `/path/to/wechatpay/inWechatpaySerial.pem` $certInstance = PemUtil::loadCertificate('/path/to/wechatpay/inWechatpaySerial.pem'); // 检查通知时间偏移量,允许5分钟之内的偏移 $timeOffsetStatus = 300 >= abs(Formatter::timestamp() - (int)$inWechatpayTimestamp); $verifiedStatus = Rsa::verify( // 构造验签名串 Formatter::joinedByLineFeed($inWechatpayTimestamp, $inWechatpayNonce, $inBody), $inWechatpaySignature, $certInstance ); if ($timeOffsetStatus && $verifiedStatus) { $inBodyArray = (array)json_decode($inBody, true); ['resource' => [ 'ciphertext' => $ciphertext, 'nonce' => $nonce, 'associated_data' => $aad ]] = $inBodyArray; $inBodyResource = AesGcm::decrypt($ciphertext, $apiv3Key, $nonce, $aad); $inBodyResourceArray = (array)json_decode($inBodyResource, true); // print_r($inBodyResourceArray);// 打印解密后的结果 } [代码] APIv2回调通知 从请求头[代码]Headers[代码]获取[代码]Request-ID[代码],商户侧[代码]Web[代码]解决方案可能有差异,请求头的[代码]Request-ID[代码]可能大小写不敏感,请根据自身应用来定; 获取请求[代码]body[代码]体的[代码]XML[代码]纯文本; 调用[代码]SDK[代码]内置方法,根据签名算法做本地数据签名计算,然后与通知文本的[代码]sign[代码]做[代码]Hash::equals[代码]对比验签; 消息体需要解密的,调用[代码]SDK[代码]内置方法解密; 如遇到问题,请拿[代码]Request-ID[代码]点击这里,联系官方在线技术支持; 样例代码如下: [代码]use WeChatPay\Transformer; use WeChatPay\Crypto\Hash; use WeChatPay\Crypto\AesEcb; use WeChatPay\Formatter; $inBody = '';// 请根据实际情况获取,例如: file_get_contents('php://input'); $apiv2Key = '';// 在商户平台上设置的APIv2密钥 $inBodyArray = Transformer::toArray($inBody); // 部分通知体无`sign_type`,部分`sign_type`默认为`MD5`,部分`sign_type`默认为`HMAC-SHA256` // 部分通知无`sign`字典 // 请根据官方开发文档确定 ['sign_type' => $signType, 'sign' => $sign] = $inBodyArray; $calculated = Hash::sign( $signType ?? Hash::ALGO_MD5,// 如没获取到`sign_type`,假定默认为`MD5` Formatter::queryStringLike(Formatter::ksort($inBodyArray)), $apiv2Key ); $signatureStatus = Hash::equals($calculated, $sign); if ($signatureStatus) { // 如需要解密的 ['req_info' => $reqInfo] = $inBodyArray; $inBodyReqInfoXml = AesEcb::decrypt($reqInfo, Hash::md5($apiv2Key)); $inBodyReqInfoArray = Transformer::toArray($inBodyReqInfoXml); // print_r($inBodyReqInfoArray);// 打印解密后的结果 } [代码]
2021-08-22 - 【有奖反馈】参与微信支付文档来“找茬”,轻松赢好礼
各位致力于微信支付的GG、MM们,福利到了~ 微信支付文档现推出有奖反馈活动了~ 如果文档曾帮您解决过困惑,请您记得为它点赞; 如果您发现文档存在内容未及时更新、内容有错误、阅读体验不佳等任何文档问题时,也请您告诉我们~ 现在参与反馈,分享您的体验,就有机会获得精美好礼哦 非常感谢大家支持,我们将虚心接受反馈~ 努力为大家提供更好的文档体验~ 【六期活动时间】 2021年5月25日-2021年6月30日 【活动礼品】 最佳反馈奖:自研-微信黄脸收纳套装 *1 模 范 奖:自研-怪奇鹅雨伞*3 幸 运 奖 :荣耀时刻钥匙扣礼盒 *5 [图片] *礼品说明:礼品为临时采购,可能因为断货等原因无法采购到对应礼品,我们会根据礼品价值进行等额更换,但会保证是腾讯特色礼品,敬请谅解! 【参与方式】 参与微信支付开放文档问题反馈活动的三种方式见下方截图: [图片] *特别提醒,登录或填写邮箱更便于我们快速联系您发送礼品~ 【评奖方式】 本次文档有奖反馈奖励对象为有效问题贡献者。经评估采纳后的问题,均可作为有效问题进行评奖。 最佳反馈奖:反馈最具价值问题的同学 模 范 奖:反馈最多有效问题的同学 幸 运 奖:随机抽取积极参与的同学 *活动结束后7个工作日内公布获奖名单,同一ID重复获奖以最高奖为准,其他奖项顺延。 [图片] 往期获奖名单及获奖礼品 【一期】 活动时间:2020年10月22日-2020年11月22日 获奖名单: 最佳反馈奖:北望沣渭 模范奖:peng 、老张 幸运奖:Meng 、一步 、 Dylan 、 Meゞ夨ヤ譩 礼品展示: [图片] 【二期】 活动时间:2020年11月23日-2020年12月23日 获奖名单: 最佳反馈奖:Memory 模范奖:周公子 、Menng 、James¹⁰¹⁴ 幸运奖:陈岩、 IoneIyIizard、 T⃰i⃰n⃰a⃰ 、Kit 、danfei 礼品展示: [图片] 【三期】 活动时间:2020年12月24日-2021年3月22日 获奖名单: 最佳反馈奖:Cooper 模范奖:Memory 、石头 、刘占阳 Roy 幸运奖:陈岩 、福仁先生、 魏杨杨 、shim 、青寒 XP~ 礼品展示: [图片] 【四期】 活动时间:2021年3月23日-2021年4月23日 获奖名单: 最佳反馈奖:Memory 模范奖:青寒 、北望沣渭 、Shing 幸运奖:KING 礼品展示: [图片] 【五期】 活动时间:2021年4月24日-2021年5月24日 获奖名单: 最佳反馈奖:香橙薄荷凉 模范奖:Memory 、 大路朝天 幸运奖:Alan# 、不择食 、常领峰 礼品展示: [图片] 【六期】 活动时间:2021年5月25日-2021年6月30日 获奖名单: 最佳反馈奖:Memory 模范奖:danfei 、杨 、不悔之年 幸运奖:Jerry 、MEMSEVEN 、℡别皱眉 礼品展示: [图片]
2021-07-08 - 个人微信支付新手攻略整理
前言: 虽然有部分微信支付对接经验,但在整个微信支付生态中,我自己也是新手。 此文用来制作新手攻略,以及微信支付知识的梳理记录。 一、【入门问题篇】 入门级的几个初级问题。 1,申请接入微信支付要花钱吗? 申请费用:无 交易服务费:根据商家经营类目判定,0.6%-1%不等 费率与结算周期说明:https://kf.qq.com/faq/140225MveaUz1501077rEfqI.html 2,我该去哪申请? 微信支付商户平台:https://pay.weixin.qq.com/ 3,我们有APP、公众号、小程序等多个应用,需要申请几个商户号? 申请1个商户号即可,都关联同一个商户号。 4,需要写代码进行支付对接吗? 多数支付都需要商家有开发能力,进行代码研发; 也有无需开发的,比如微信收款商业版。 5,申请微信支付需要哪些企业信息? 一般需要营业执照、对公账号、法人证件等。 6,各种微信支付对接都涉及哪些平台网站? 微信商户平台(商户号):https://pay.weixin.qq.com/ 微信公众平台(公众号、小程序):https://mp.weixin.qq.com/ 企业微信平台:https://work.weixin.qq.com/ 二、【场景选择篇】 这需要根据你们的业务场景,申请接入对应的微信支付。 官方指引截图:https://pay.weixin.qq.com/static/applyment_guide/applyment_index.shtml [图片] 场景 前提 对接支付 是否需开发 文档地址 线下场所 付款码支付 需要 开发文档 JSAPI支付 需要 开发文档 微信收款商业版 不需要 文档地址 公众号 已做微信认证;服务号、政府或媒体订阅号。 JSAPI支付 需要 开发文档 小程序 已做微信认证的小程序。 小程序支付 需要 开发文档 PC网站 网站域名已ICP备案。 JSAPI支付 需要 开发文档 Native支付 需要 开发文档 APP 微信开放平台创建APP,且平台已认证。 APP支付 需要 开发文档 企业微信 企业微信平台注册,且平台已认证。 向员工发红包 需要 开发文档 向员工付款 需要 开发文档 向员工收款 需要 开发文档 手机网站(非微信环境) H5支付 需要 开发文档 三、【业务流程篇】 简要业务实现逻辑描述。 大体流程: 商家系统:通过各种处理(预订单、二维码等),向用户展示收款页面; 用户:付款支付; 微信系统:异步通知商家服务器; 商家系统:处理用户付款后续。 以JSAPI支付为例,下图来自官方。 [图片] 四、【运营工具篇】 你可能感兴趣的: 现金红包: https://pay.weixin.qq.com/static/product/product_intro.shtml?name=hongbao 代金券: https://pay.weixin.qq.com/static/product/product_intro.shtml?name=coupon 立减与折扣: https://pay.weixin.qq.com/static/product/product_intro.shtml?name=minus 企业付款到零钱: https://pay.weixin.qq.com/static/product/product_intro.shtml?name=wallet 分账: https://pay.weixin.qq.com/static/product/product_intro.shtml?name=cmn 五、【高手进阶篇】 社区网友文章推荐: 1,如何用十个月时间,做出一款迄今为止无法超越的微信支付SDK基础开发包? - 微信开放社区 https://developers.weixin.qq.com/community/pay/article/doc/000886b054c7708ae8ebcc04b5b013 2,ASP.NET Core 微信支付? - 微信开放社区 https://developers.weixin.qq.com/community/pay/article/doc/0000aef5b20b002a02fb5a9f75b013 3,微信支付商户入门(合集)最后更新时间2021年4月5号? - 微信开放社区 https://developers.weixin.qq.com/community/pay/article/doc/000ce0be104fe8db37fbf478b5b813 4,「干货分享」一文了解微信优惠券产品(卡券、代金券、商家券)? - 微信开放社区 https://developers.weixin.qq.com/community/pay/article/doc/000460b5934fd0f7f1eb902a251013 5,真香:一行命令即可体验「微信支付」全系接口能力? - 微信开放社区 https://developers.weixin.qq.com/community/develop/article/doc/000e264b100a88609bebe202856413 6,订单支付成功,但是一直未收到微信的支付成功回调通知? - 微信开放社区 https://developers.weixin.qq.com/community/develop/doc/000a8e42b54488af574b1f48156809 7,搞懂微信支付 v3 接口规则-【附Java源码】? - 微信开放社区 https://developers.weixin.qq.com/community/develop/article/doc/000cca8440c6a0dca61a3efb053c13 8,微信支付后默认关注公众号与推荐关注公众号规则? - 微信开放社区 https://developers.weixin.qq.com/community/develop/article/doc/0008c6203446a0dc706ba798f51c13 9,微信支付普通分账、服务商分账申请高比例流程及材料(4月8号更新)? - 微信开放社区 https://developers.weixin.qq.com/community/develop/article/doc/00042e3a5b4d78f5f06bcdfb951c13 10,云开发微信支付配置添加商户号后,绑定状态为“待模板消息确认”如何处理?? - 微信开放社区 https://developers.weixin.qq.com/community/develop/article/doc/0004e0e32bcf006ab06bdca4f56813 11,微信支付商户免充值代金券接口升级验收指引(一)用例组合1003+1004+1005? - 微信开放社区 https://developers.weixin.qq.com/community/develop/article/doc/0000c6941647a085d6fbe0fb256013 12,申请退款API 所使用资金对应的资金账户类型区别? - 微信开放社区 https://developers.weixin.qq.com/community/develop/article/doc/00042215948a6895ecfb44b935d013 13,创建代金券接口报错:“可用商户不符合规则,请检查” 是什么原因? - 微信开放社区 https://developers.weixin.qq.com/community/develop/article/doc/00064aac3c00b075e8fb57c0c54c13 14,发送失败,此请求可能存在风险,已被微信拦截,是什么原因? - 微信开放社区 https://developers.weixin.qq.com/community/develop/article/doc/0004c65f0640804db3fba1feb56413 15,V3调起支付报错:“支付失败,请稍后重试” 解决方案? - 微信开放社区 https://developers.weixin.qq.com/community/develop/article/doc/000482f9ce03e847faebc2c0756413 16,公众号支付报错:“当前页面的URL未注册”? - 微信开放社区 https://developers.weixin.qq.com/community/develop/article/doc/0002cc472406c8f0e7eb09cfa54c13 17,企业付款到零钱API钱没到账该如何处理? - 微信开放社区 https://developers.weixin.qq.com/community/develop/article/doc/00082a437648f8b0daebad6b05b013 18,收不到微信支付回调通知解决方案? - 微信开放社区 https://developers.weixin.qq.com/community/develop/article/doc/000cc28e044630e65deba58ad56c13 19,openid和appid不匹配该如何解决? - 微信开放社区 https://developers.weixin.qq.com/community/develop/article/doc/00080a39a30378f34eebe89575b013 20,图片上传(营销)demo_PHP版本? - 微信开放社区 https://developers.weixin.qq.com/community/develop/article/doc/0008aea4170db86b1aeba260a5b413 六、【社区支付专区篇】 有支付问题可以到微信开放社区发问。 专区地址:https://developers.weixin.qq.com/community/pay 官方介绍:【微信支付新人必读】智慧的提问,快速的解答? - 微信开放社区 https://developers.weixin.qq.com/community/develop/article/doc/0004a8c574082063ab3b2703751813 感谢阅读!
2021-05-10 - 微信支付商户免充值代金券接口升级验收脚本 用例组合1001+1002+1003+1004+1005(强迫症专用)
为什么要进行接口升级验收 商户开通免充值类产品功能后,微信支付接口和账单格式会有调整,商户内部系统需要适配升级后的接口参数。 注:本文所提供脚本代码需要电脑安装python环境才可以运行。 注意:一键验收脚本虽好,自己应用层代码也需要改哦 如何进行接口升级 准备事项 1) 微信支付商户号 -2)微信支付商户号对应32位秘钥 以下是升级脚本代码,替换自己的商户号和密钥运行即可 运行后可以在下面链接查询验收结果,脚本执行遇到报错或遇到网络问题可以多次运行直到成功 https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=15_6&index=4 [代码]import time from xml.dom import minidom import hashlib from heapq import heappush, heappop from collections import OrderedDict import requests SandBox_Url = 'https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey' MicroPay_Url = "https://api.mch.weixin.qq.com/sandboxnew/pay/micropay" UnifiedOrder_Url = "https://api.mch.weixin.qq.com/sandboxnew/pay/unifiedorder" OrderQuery_Url = "https://api.mch.weixin.qq.com/sandboxnew/pay/orderquery" ReFund_Url = "https://api.mch.weixin.qq.com/sandboxnew/pay/refund" RefundQuery_Url = "https://api.mch.weixin.qq.com/sandboxnew/pay/refundquery" DownloadBill_Url = "https://api.mch.weixin.qq.com/sandboxnew/pay/downloadbill" nonce_str = "5K8264ILTKCH16CQ2502SI8ZNMTM67VS" if __name__ == '__main__': mch_id = "" wxpay_key = "" def get_sign_key(mch_id, key): template = "<xml><mch_id><![CDATA[{0}]]></mch_id>" \ "<nonce_str><![CDATA[{1}]]></nonce_str>" \ "<sign><![CDATA[{2}]]></sign></xml>" nonce_str = "5K8264ILTKCH16CQ2502SI8ZNMTM67VS" encrypted_str = "mch_id=" + mch_id + "&nonce_str=" + nonce_str + "&key=" + key m = hashlib.md5() m.update(encrypted_str.encode('utf-8')) sign_key_request_data = template.format(mch_id, nonce_str, m.hexdigest().upper()) result = requests.post(SandBox_Url, sign_key_request_data) dom = minidom.parseString(result.content) root = dom.documentElement sandbox_signkey = '' if root.getElementsByTagName("return_code")[0].childNodes[0].nodeValue == "FAIL": retmsg = root.getElementsByTagName("return_msg")[0].childNodes[0].nodeValue raise RuntimeError("请求出了点小错误:" + retmsg) else: sandbox_signkey = root.getElementsByTagName("sandbox_signkey")[0].childNodes[0].nodeValue print("亲,这就是你的沙箱密钥了哦: \n" + sandbox_signkey) return sandbox_signkey def to_tree_map(param_map): keys = param_map.keys() heap = [] for item in keys: heappush(heap, item) sort = [] while heap: sort.append(heappop(heap)) res_map = OrderedDict() for key in sort: res_map[key] = param_map.get(key) return res_map def build_xml(param, wxpay_key): tree_map = to_tree_map(param) encrypted_str = "" for k in tree_map: encrypted_str += "{}={}&".format(k, tree_map[k]) encrypted_str = encrypted_str + "key=" + wxpay_key m = hashlib.md5() m.update(encrypted_str.encode('utf-8')) sign = m.hexdigest().upper() param.update(sign=sign) complete_tree_map = to_tree_map(param) xml = "<xml>" for k in complete_tree_map: xml += "<{}><![CDATA[{}]]></{}>".format(k, complete_tree_map[k], k) xml += "</xml>" return xml def request_handler(url, xml, desc): result = requests.post(url, xml) print(desc + "我才不是请求结果呢:\n" + result.content.decode("utf-8")) def upgrade(mch_id, wxpay_key): if mch_id == "": raise RuntimeError("出差错了哦,亲,你的商户号在哪呢?不填写商户号亲亲是要给空气去验收吗?") if wxpay_key == "": raise RuntimeError("出差错了哦,亲,你不填写商户密钥怎么继续呢,是用爱吗?") key = get_sign_key(mch_id, wxpay_key) nonce_str = "5K8264ILTKCH16CQ2502SI8ZNMTM67VS" out_trade_no = round(time.time()) MicroPay_param = { 'appid': "wxd678efh567hg6787", 'mch_id': mch_id, 'nonce_str': nonce_str, 'body': "check", 'out_trade_no': out_trade_no, 'total_fee': "501", 'spbill_create_ip': "8.8.8.8", 'auth_code': "120061098828009406", } MicroPay_xml = build_xml(MicroPay_param, key) request_handler(MicroPay_Url, MicroPay_xml, "亲,用例编号1001刷卡正常支付有结果了,快来看呀 \n") time.sleep(1) OrderQuery_param = { 'appid': "wxd678efh567hg6787", 'mch_id': mch_id, 'nonce_str': nonce_str, 'out_trade_no': out_trade_no, } OrderQuery_xml = build_xml(OrderQuery_param, key) request_handler(OrderQuery_Url, OrderQuery_xml, "亲,用例编号1001刷卡正常支付查询出结果了,快来看呀 \n") time.sleep(1) out_trade_no_2nd = round(time.time()) print("我是1002下单的订单号:",+ out_trade_no_2nd) MicroPay_param = { 'appid': "wxd678efh567hg6787", 'mch_id': mch_id, 'nonce_str': nonce_str, 'body': "check", 'out_trade_no': out_trade_no_2nd, 'total_fee': "502", 'spbill_create_ip': "8.8.8.8", 'auth_code': "120061098828009406", } MicroPay_xml = build_xml(MicroPay_param, key) request_handler(MicroPay_Url, MicroPay_xml, "亲,用例编号1002刷卡正常支付结果来了,你还抓紧不来看 \n") time.sleep(1) OrderQuery_param = { 'appid': "wxd678efh567hg6787", 'mch_id': mch_id, 'nonce_str': nonce_str, 'out_trade_no': out_trade_no_2nd, } OrderQuery_xml = build_xml(OrderQuery_param, key) request_handler(OrderQuery_Url, OrderQuery_xml, "亲,用例编号1002刷卡正常支付查询结果,结果好像有点不太对呢 \n") time.sleep(1) ReFund_param = { 'appid': "wxd678efh567hg6787", 'mch_id': mch_id, 'nonce_str':nonce_str, 'out_refund_no': out_trade_no, 'total_fee': "502", 'refund_fee': "501", 'out_trade_no': out_trade_no_2nd, } ReFund_xml = build_xml(ReFund_param, key) request_handler(ReFund_Url, ReFund_xml, "亲,下面展示的是用例编号1002刷卡支付退款的结果,你猜对不对 \n") time.sleep(1) RefundQuery_param = { 'appid': "wxd678efh567hg6787", 'mch_id': mch_id, 'nonce_str':nonce_str, 'out_trade_no': out_trade_no_2nd, } RefundQuery_xml = build_xml(RefundQuery_param, key) request_handler(RefundQuery_Url, RefundQuery_xml, "亲,用例编号1002刷卡支付退款查询结果返回中,加载不出来长按电源键或Ait+F4重试哦 \n") time.sleep(1) nonce_str = "5K8264ILTKCH16CQ2502SI8ZNMTM67VS" out_trade_no = round(time.time()) UnifiedOrder_param = { 'appid': "wxd678efh567hg6787", 'mch_id': mch_id, 'nonce_str': nonce_str, 'body': "check", 'out_trade_no': out_trade_no, 'total_fee': "551", 'notify_url':"https://www.weixin.qq.com/wxpay/pay.php", 'spbill_create_ip': "8.8.8.8", 'trade_type': "JSAPI", } UnifiedOrder_xml = build_xml(UnifiedOrder_param, key) request_handler(UnifiedOrder_Url, UnifiedOrder_xml, "亲,用例编号1003-公众号/APP/扫码正常支付有结果了,快来看呀 \n") time.sleep(1) OrderQuery_param = { 'appid': "wxd678efh567hg6787", 'mch_id': mch_id, 'nonce_str': nonce_str, 'out_trade_no': out_trade_no, } OrderQuery_xml = build_xml(OrderQuery_param, key) request_handler(OrderQuery_Url, OrderQuery_xml, "亲,用例编号1003-公众号/APP/扫码正常支付查询出结果了,快来看呀 \n") time.sleep(1) out_trade_no_2nd = round(time.time() * 1000) print("我是1002下单的订单号:",+ out_trade_no_2nd) UnifiedOrder_param = { 'appid': "wxd678efh567hg6787", 'mch_id': mch_id, 'nonce_str': nonce_str, 'body': "check", 'out_trade_no': out_trade_no_2nd, 'total_fee': "552", 'notify_url':"https://www.weixin.qq.com/wxpay/pay.php", 'spbill_create_ip': "8.8.8.8", 'trade_type': "JSAPI", } UnifiedOrder_xml = build_xml(UnifiedOrder_param, key) request_handler(UnifiedOrder_Url, UnifiedOrder_xml, "亲,用例编号1004-公众号/APP/扫码支付退款结果来了,你还抓紧不来看 \n") time.sleep(1) OrderQuery_param = { 'appid': "wxd678efh567hg6787", 'mch_id': mch_id, 'nonce_str': nonce_str, 'out_trade_no': out_trade_no_2nd, } OrderQuery_xml = build_xml(OrderQuery_param, key) request_handler(OrderQuery_Url, OrderQuery_xml, "亲,用例编号1004-公众号/APP/扫码支付退款查询结果,结果好像有点不太对呢 \n") time.sleep(1) ReFund_param = { 'appid': "wxd678efh567hg6787", 'mch_id': mch_id, 'nonce_str':nonce_str, 'out_refund_no': out_trade_no, 'total_fee': "552", 'refund_fee': "551", 'out_trade_no': out_trade_no_2nd, } ReFund_xml = build_xml(ReFund_param, key) request_handler(ReFund_Url, ReFund_xml, "亲,下面展示的是用例编号1004-公众号/APP/扫码支付退款的结果,你猜对不对 \n") time.sleep(1) RefundQuery_param = { 'appid': "wxd678efh567hg6787", 'mch_id': mch_id, 'nonce_str':nonce_str, 'out_trade_no': out_trade_no_2nd, } RefundQuery_xml = build_xml(RefundQuery_param, key) request_handler(RefundQuery_Url, RefundQuery_xml, "亲,用例编号1004-公众号/APP/扫码支付退款查询结果返回中,加载不出来长按电源键或Ait+F4重试哦 \n") time.sleep(1) DownloadBill_param = { 'appid': "wxd678efh567hg6787", 'mch_id': mch_id, 'nonce_str': nonce_str, 'bill_date': "2021-04-01", 'bill_type': "ALL" } DownloadBill_xml = build_xml(DownloadBill_param, key) request_handler(DownloadBill_Url, DownloadBill_xml, "亲,你要下载交易的对账单来了,加载中······,加载不出来长按电源键或Ait+F4重试哦 \n") upgrade(mch_id, wxpay_key) [代码] 没有写注释的习惯,遇到错误可以私信我,拒绝手摸手教学
2021-05-10 - 微信支付服务商成长历程-「做支付务必了解的央行政策文件」更新时间 2021-04-18
前言 本文主要列举七个文件,包括支付行业三座大山:央行217号文,281号文,296号文,建议重点关注,合规才能活下去(暂不含收单外包服务机构备案内容)。 1、 银支付〔2017〕14号《中国人民银行支付结算司关于开展违规“聚合支付”服务清理整治工作的通知》 2017年2月发布了《中国人民银行支付结算司关于开展违规“聚合支付”服务清理整治工作的通知》,收单机构与聚合支付技术服务商合作不得将商户资质审核、受理协议签订、资金结算、收单业务交易处理、风险监测、密钥管理等业务外包;不得允许聚合技术服务商以大商户模式入网。违规处罚对聚合支付的影响给做聚合支付“二清”的企业敲警钟。 2、中国人民银行关于持续提升收单服务水平 规范和促进收单服务市场发展的指导意见(银发〔2017〕45号) 2017年3月发布《中国人民银行关于持续提升收单服务水平规范和促进收单服务市场发展的指导意见》,其对聚合支付主要内容有: 聚合支付 (1)鼓励为特约商户提供“聚合支付”服务 (2)聚合支付需严格遵守《中国人民银行关于加强银行卡收单业务外包管理的通知》 (3)要求收单机构强化聚合支付风险管理 对聚合支付的影响 央行认可聚合支付价值,需遵守银行卡收单外包规定 3、 银行卡收单外包服务机构评级指引 2017年10月,中国支付清算协会关于印发《银行卡收单外包服务机构评级指引》,对聚合支付所归属的收单外包进行评级管理,要求按照经营规模、财务状况、业务情况、风险情况、创新业务等项目对银行卡收单外包服务机构将进行每年一次的分类评级,并将分为ABCDE共5类8级。 对聚合支付的影响 对被定义为收单外包机构的聚合支付进行8评级管理,定时抽查。 4、关于进一步加强无证经营支付业务整治工作的通知 (银办发〔2017〕217号) 2017年11月发布了《关于进一步加强无证经营支付业务整治工作的通知》,即央行217文件,加强无证机构整治,持证机构自查于2017年年底完成,人行分支机构组织检查于2018年2月底前完成,人行总行现场督查2018年4月底前完成。 对聚合支付的影响 (1)全面检查持证机构,筛查无证机构名单,聚合支付通道紧张。 (2)以查处无证机构为切入点,结合无证整治和投诉举报等线索,彻查为其提供支付服务的持证机构 5、中国人民银行关于规范支付创新业务的通知(银发〔2017〕281号) 2017年12月发布中国人民银行关于规范支付创新业务的通知,即央行281文件,其对聚合支付的主要内容有: 聚合支付 (1)聚合支付业务宣传不得使用“零扣率”、“套现”等涉嫌不正当竞争、误导消费者或者违法违规行为的文字。 (2)小微商户使用卡收单,日累计1000元、月累计1万元。 (3)加强支付系统通道管理。 对聚合支付的影响 信用卡套现业务受影响,支付通道进一步紧张。 6、 《条码支付业务规范(试行)》(银发〔2017〕296号) 2017年12月印发《条码支付业务规范(试行)》的通知,即央行296文件,其主要内容有: 条码支付 (1)开展条码支付业务需要同时具备网络支付牌照和收单牌照 (2)2018年4月1日后,固态二维码单日累计限额500元。 对聚合支付的影响 聚合支付业务限额,合规性存疑。 7、 中国人民银行办公厅关于加强条码支付安全管理的通知(银办发〔2017〕242号) 2017年12月,中国人民银行办公厅关于《加强条码支付安全管理》的通知,对条码支付各项技术和安全指标进行规定。 对聚合支付的影响 聚合支付需要符合安全规定。 聚合支付的未来 在合法合规经营的条件下,聚合支付仍然有很好的发展前景。首先,存在即是合理的,在当前的支付环境下,聚合支付实现了“一码通”,提升了支付体验。其次,聚合支付可以减少收单设备重复布放,降低了支付机构的成本,存在市场空间。只要聚合支付走专业化之路,结合自身优势资源挖掘潜力拓展新的业务才能越走越远。 更多服务商相关文档可查看:https://developers.weixin.qq.com/community/develop/article/doc/000e663ce2ce683b30fb16dab51013
2021-04-18 - 微信支付服务商成长历程-「微信支付服务商概述」更新时间 2021-04-18
服务商简介 普通服务商 指接受商户委托,为商户生产、维护相关软件和信息系统,帮助商户接入微信支付,代理商户申请开通微信支付,生成、传输微信支付交易订单信息的机构。应与财付通签订《微信支付合作协议》。 从业机构 指自行拓展并管理商户,委托财付通通过微信支付代收商户交易款项的商业银行。从业机构应对商户进行有效管理,将交易款结算给商户,并与财付通签订《微信支付服务协议(银行受理机构)》及《补充协议》,或者与财付通签订从业机构《合作协议》。 渠道商 指从业机构负责管理的,为从业机构拓展商户并提供微信支付接入技术支持的企事业单位。 [图片] [图片] 申请方式 普通服务商 仅面向通过微信认证的企业类型服务号开放申请 ,在公众平台内申请,选择服务商类型。 http://kf.qq.com/faq/161220iqeAfA1612202yeURB.html 从业机构(银行或支付机构) 访问下述链接申请 https://pay.weixin.qq.com/index.php/public/bare_applyment/login4bank 渠道商 联系银行或支付机构录入渠道商资料 境外服务商 参考链接提供所需资料发邮件申请 https://pay.weixin.qq.com/index.php/public/wechatpay_en 服务商合作规则 服务商应保证商户能够安全、顺畅、稳定、合规地使用微信支付,详情查阅链接 https://pay.weixin.qq.com/index.php/public/apply_sign/protocol_dev_rule 申请成为服务商是否收费? 申请成为微信支付服务商腾讯不收取任何费用,服务商名下特约商户在交易过程会产生一定的费率。 https://pay.weixin.qq.com/index.php/public/cms/content_detail?lang=zh&id=72600 [图片]
2021-05-10 - 「干货分享」一文了解微信优惠券产品(卡券、代金券、商家券)
相信很多产品运营和开发的朋友刚接触到微信营销,听到什么优惠券、卡券、代金券、支付券、商家券,是不是一脸懵逼,我只是想做个优惠而已,要不要这么复杂,这到底该接哪一个?希望这篇文章能让你有一个更加清晰的了解。 不管是卡券、代金券、商家券这些我们都可以统称为“优惠券”,而微信支付代金券有另一种叫法“支付券”,其实支付券还包含立减折扣的。 [图片] 优惠券定义 卡券:是微信公众号提供的一套电子卡券解决方案,实现卡券生成、下发、领取、核销的闭环,并使用对账、卡券管理等配套功能。 微信卡券能力不只包含普通的优惠券(代金券、折扣、兑换、团购、优惠券),还有会员卡、礼品卡、票证(电影票、汽车票、景点门票等)。商户可自行在公众平台或通过 接口 创建卡券,多种渠道投放给用户,用户用券时需核销卡券。 比如100元的订单金额,用户有一张10元代金券,商家先核销这10元代金券,再计算用户实际需要支付金额(90元),支付方式不限制微信支付、其他支付也是可以的。 代金券(即支付券):是微信支付面向商户的一种营销工具,商户创建代金券,可以发送给用户,当用户使用微信支付时,代金券会伴随交易自动核销/抵扣,帮助商户便捷地落地营销活动。 代金券类型包含预充值和免充值两种类型,预充值代金券适用于第三方出资策划的活动,例如:满100减10. 指订单金额100元,用户实付90元,商户实收100元;免充值适用于商户策划的活动,例如:满100减10。 指订单金额100元,用户实付90元(用户领券后,在支付中直接核销10元),商户实收90元。 [图片] 商家券:是微信支付为商户提供的电子优惠券解决方案,商家可在微信支付允许的范围内通过该功能实现商家优惠券信息生成、下发、领取、核销的闭环,并使用数据对账、券信息查询等配套功能完成商家券的管理操作。(目前只提供API接口功能,暂无法在商户平台创建) 其实可以说商家券就是卡券优惠券的升级版,都是商家自主核销,只是他们分属不同的平台,一个是公众号(卡券),一个是微信支付商户平台(商家券)。 [图片] 重要通知 微信卡券-优惠券功能现即将下线,有发券需要的商户尽快升级到“微信支付优惠券”:商家券或支付券(即代金券)。此次模块升级不涉及会员卡、礼品卡、票证产品不影响。https://mp.weixin.qq.com/cgi-bin/announce?action=getannouncement&announce_id=11614329634x9Pvw&version=&lang=zh_CN&token= 优惠券产品框架 从投放场景、类型、核销看一下优惠券生态圈 [图片] 产品能力对比 内容 卡券(即将下线) 支付券(代金券) 商家券 平台体系 微信公众号 微信支付商户号 微信支付商户号 核销规则 商家核销,不限制微信支付 微信支付自动核销 商家核销,不限制微信支付 卡包 领券后进入卡包 平台发券,自动进入卡包;API发券需申请插卡权限 领券后进入卡包 自定义券码 支持 不支持 支持 营销场景 二维码;公众号消息;朋友圈广告;商家H5/APP/小程序 二维码;朋友圈;商家H5/APP/小程序;平台扫码领券、支付有礼、附近发券等 二维码;朋友圈;商家H5/APP/小程序;平台扫码领券、支付有礼、附近发券等 营销经费 无需充值(垫资) 支持预充值和免充值 无需充值(垫资) 开发能力 后台支持基本创建券与核销,同时支持商家API接口 后台支持创建券发券场景,同时支持API接口 目前只有API接口,无法在后台创建券 注:卡券优惠券产品即将下线,就不要过多关注了,了解一下就好了哈~~ 相关链接 微信卡券产品文档:https://mp.weixin.qq.com/cgi-bin/readtemplate?t=cardticket/faq_tmpl&type=info&token=1472580499&lang=zh_CN 微信卡券接口文档:https://developers.weixin.qq.com/doc/offiaccount/Cards_and_Offer/WeChat_Coupon_Interface.html 微信支付代金券产品文档:https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter5_1_1.shtml 微信支付商家券产品文档:https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter5_2_1.shtml
2021-05-10 - 微信支付商户入门(合集)最后更新时间2021年5月13号
[图片] 阅读前必读 1、可电脑、手机同时查看。PC方便,收藏点赞后更方便。 2、内容多,务必先看文章右侧的目录 3、部分内容含介绍链接或文档下载链接,可点击超链接文章直接打开。 4、内容会尽量不断更新,请以实际情况为准。如果此文不能解决您的问题,请务必描述问题或需求,提供商户号等基本信息私信沟通,我将会尽量解决你的问题。 5、 嫌更新慢,来打赏催更 6、想了解哪方面内容,可以跟帖回复,根据大家需求优先更新。 微信支付商户概述 微信支付商户简介 链接待更新 微信支付商户申请接入 链接待更新 微信支付风控解读(必读) 链接待更新 微信支付基础功能 链接待更新 微信支付营销功能 代金券 链接待更新 商家券 链接待更新 现金红包 微信支付商户经营工具-「现金红包」产品介绍及开通使用过程中的问题说明 点后面链接查看哦:https://developers.weixin.qq.com/community/develop/article/doc/0002e86196cf60d90c1c2efd451013 支付有礼 链接待更新 微信支付经营功能 企业付款到零钱 微信支付商户经营工具-「企业付款到零钱」产品介绍及开通使用过程中的问题说明 点后面链接查看哦:https://developers.weixin.qq.com/community/develop/article/doc/000ee8684ecb9873061cd257651813 企业付款到银行卡 微信支付商户经营工具-「企业付款到银行卡」产品说明及开通使用 点后面链接查看哦:https://developers.weixin.qq.com/community/develop/article/doc/00046663b08f78690f1cab70956c13 批量付款到零钱 链接待更新 微信收款商业版 链接待更新 支付即服务 链接待更新 分账 链接待更新 支付分 链接待更新 扣费服务 链接待更新 拼单 链接待更新 微信支付先享卡 链接待更新 微信支付行业功能 无感停车 链接待更新 扫码点餐 链接待更新 K12校园刷脸支付、离线扣费 链接待更新 智慧商圈 链接待更新 酒店押金服务 链接待更新
2021-05-14 - 有奖征文 | 从产品设计、开发到运营维护,说说你与微信支付的那些事儿
各位微信支付的小伙伴们,花开春已至,在一片春意盎然中,也迎来了四月份的微信支付有奖文章活动月~ 如果你刚从业微信支付,那你一定对微信支付如何更好入门有许多的见地,新人总是能发现许多新东西~ 如果你从业微信支付已久,那你一定沉淀了好多好多支付经验和实战,想要分享~ So~这个4月对于微信支付的小伙伴们而言,最不能错过的便是此次微信支付有奖文章活动月了~ 它为每一个从业微信支付并想要表达的你,搭建了一个舞台,而且还有许多精美礼品~ 回到主题,那什么是微信支付文章月活动呢? 微信支付文章月活动就是微信支付开放社区面向所有微信支付社区用户,征集微信支付相关文章,不限题材、不限角度~ 【活动时间】 2021年4月1日-2021年4月30日 【参与方式】 进入微信支付版块,点击「发帖」,选择「发表文章」即可参与文章月活动~ 文章内容不限题材、不限角度,你能想到的和微信支付相关的都可以,如:微信支付相关的产品设计、微信支付相关的开发实战、微信支付相关的运营维护,当然内容不能涉及广告~ [图片] 活动必知: 本次活动推荐使用Markdown编辑器但不必须; 文章标签添加「微信支付文章活动月」,该标识为该文章参与本次微信支付有奖文章活动月活动。 [图片] 【活动礼品】 出类拔萃奖:微信支付行李箱 *1 ,1名 精选文章奖:微信支付保温壶/移动电源 随机 *1 ,5名 幸运锦鲤奖:微信支付简约马克杯/简约白色帽子/透明雨伞 随机 *1, 20名 [图片] *礼品说明:礼品选自微信支付为商户定制的官方礼品,由物料服务运营组提供。 【评选方式】 出类拔萃奖:从内容质量、排版、可操作性等多个维度评选1篇整理质量最高的文章; 精选文章奖:从内容质量、可操作性等多个维度评选内容质量仅次于出类拔萃奖的5篇文章; 幸运锦鲤奖:根据从活动开始至活动结束的总有效文章数的百分比楼层抽取(第‘总层数*5%’层、第‘总层数*10%’层,第‘总层数*15%’层...以此类推),楼层数四舍五入。 *有效文章:非官方,带活动标识、原创、非广告、文章通顺、内容具有可实操性。 【活动规则】 必须是原创文章,禁止抄袭、复制他人作品,一经发现取消其获奖资格;文章需为首次公开发布,且未在其它平台或社区发布过;在活动期间可发布多篇文章,同一用户最佳文章奖和精选文章奖仅可获奖一次,幸运锦鲤奖可重复;本活动不允许腾讯员工参加,若参加后中奖,则自动取消获奖资格;获奖信息将在活动结束后10个工作日内公布,为不影响正常运营,获奖用户需在获奖信息公布后5个工作日内联系微信支付社区运营-Tasting,否则视为自动放弃;如您有任何疑问,可联系微信支付社区运营-Tasting。[图片] 分割线~ 你以为这样就结束了吗? 参加本次活动的优质文章,不仅有机会获得微信支付精美礼品~ 还能添加开放社区「精选文章」标识,让你的账号离大神又近一步! 还能在支付版块首页推荐展示! 更有可能推荐到微信支付官方文档中心,让更多的人看到你的内容! 这就是知识分享的力量~ 还有还有,本次活动结束后,为鼓励大家继续进行知识分享,微信支付团队会定期评选支付版块积极贡献的用户,主要从发表优质文章及回帖积极两个维度评选,并送上微信支付精美礼品一份,鼓掌,撒花✿✿ヽ(°▽°)ノ✿ [图片]
2021-04-26 - 史上最详细一步一步介绍微信小程序微信支付功能开发
前言微信小程序开发微信支付, 相对于微信的其他功能,实话说相比之下好太多,可能是开发文档是微信支付这边撰写的缘故吧?猜的。所以微信支付在小程序中,虽然参数十分的多,环节特别的细致,但也算不上无从下手。上个项目实施了一次微信小程序支付功能的开发,趁记忆力尚可,赶紧记录一番本次环境平台为 小程序端(uniapp)| 原生一样,只介绍js部分 + egg.js端(node)流程基本都一致,只是语法上有许区别开发准备工欲善其事,必先利其器。开发之前我们需要先准备好哪些必须的开发前提或环境呢?资料:1. 审核并开通微信商户号: •微信支付页链接地址[1][图片] •等待审核, 审核通过后对小程序进行关联[图片] •小程序开启支付[图片] •小程序支付开通后[图片] •打开微信支付页,可以进行绑定查看[图片] •再到微信支付中去记录mch_id,和merchantkey(商户密码),记录merchantkey的方式如图:[图片][图片] •记录下merchantkey ,注意:merchantkey是敏感key,不可泄漏 2. 前面开发好拉取用户的授权,获取用户在当下小程序中的openid(重点必须) 3. 搭建好服务器接口调用, 记录下需要传递给微信服务器使用回调的服务器ip地址以及接口的url地址(提前准备好,可以使用postman做好测试)。(可以为本服务器也可以为另外服务器,主要作为回调) 4. 其他:微信官方文档要求 审核支付功能需要微信小程序已上线,但是当时我申请的时候小程序并未上线也过了,所以这一块我无法做出解释。另外,程序访问商户服务都是通过HTTPS,开发部署的时候需要安装HTTPS服务器 开发流程5. 先来看看官方微信支付给出的流程图[图片] •感觉有点懵逼 •我总结如下:[图片] 开始开发1.根据以上流程图,我们开始进行调用 •第一步 小程序发起支付的代码如下: async wxappay (openid, money) { return new Promise(async (resolve, reject) => { let Objct = { openid, //拉取授权获取到的openid money, //money必须是整数类型, 以RMB分为单位! body: 'xxx' } let temp = await wxappWxPay(obj) //进入到第一阶段, 预支付阶段 //后面的逻辑为第二阶段 }) } 注意,强烈推荐使用promise函数来实现,可以保证逻辑代码体在实现流程的一致性•第一步 后端node服务器接口获取支付第一部参数的代码如下: /** * 微信统一下单(微信支付)的接口数据(!!!!小程序专用付款方式) * @param {OBject} * 调用微信预支付接口(必填项) * @@排列顺序不可以错! * 1.appid * 2.body: 商品描述 * 3.mch_id: 支付申请配置的商户号 * 4.NonceStr: 随机字符串 * 5.notify_url: 微信付款后的回调地址 //后端egg的接口接收此地址来响应支付成功的回调 * 6.openid: * 7.out_trade_no: 订单号(32位) * 8.spbill_create_ip:后端调用API支付微信的ip地址 (支持32位和64位IP地址) * 9.total_fee: 支付金额 * 10. * /** * //生成微信支付的参数进行ASCII码从小到大排序 * @params: * body: 支付内容 * totalmoney: 支付金额 */ async getPrePayId(obj) { const { config, ctx } = this const { appid, merchantid, merchantkey } = config.wxapp //后台预先设置的appid,merchantid, merchantkey const { ip, notify_url } = config.payaddress const NonceStr = Math.random().toString(36).substr(2, 15) const orderid = uuid.v4().replace(/-/g, '') const { body, totalmoney, openid } = obj //预发起支付第一次签名 const uniorderParams = { appid, body, mch_id: merchantid, nonce_str: NonceStr, notify_url, openid, out_trade_no: orderid, spbill_create_ip: ip, total_fee: totalmoney, trade_type: 'JSAPI' } uniorderParams.sign = ctx.helper.getPreSign(uniorderParams, merchantkey) //根据上面的这个uniorderParams统一下单参数根据ASCii码从小到大排序,加上商户密钥做sign加密 let xml = ' ' + //重点, 必须使用xml格式来发送给微信服务器端 '' + uniorderParams.appid + ' ' + '' + uniorderParams.body + ' ' + '' + uniorderParams.mch_id + ' ' + '' + uniorderParams.nonce_str + ' ' + '' + uniorderParams.notify_url + '' + '' + uniorderParams.openid + ' ' + '' + uniorderParams.out_trade_no + '' + '' + uniorderParams.spbill_create_ip + ' ' + '' + uniorderParams.total_fee + ' ' + '' + uniorderParams.trade_type + ' ' + '' + uniorderParams.sign + ' ' + ''; const temp = await ctx.curl('https://api.mch.weixin.qq.com/pay/unifiedorder', { //统一下单的地址 method: 'POST', data: xml }) let result = {} if (temp.status == 200) { result = await ctx.helper.xmlToJson(temp.data.toString()) } /** * 获取预支付的sign签名 * 带字符串QUERY的URL的&拼接 */ getPreSign: (signParams, merchantkey) => { let keys = Object.keys(signParams).sort() let newArgs = {} keys.forEach( val => { if(signParams[val]) { newArgs[val] = signParams[val] } }) const string = queryString.stringify(newArgs) + '&key=' + merchantkey return crypto.createHash('md5').update(queryString.unescape(string), 'utf8').digest("hex").toUpperCase() } //二次签名... 1. 第一步中,如果 参数没问题,发送给微信服务器中会响应到一个prepay_id,而这个 prepay_id 就是预支付的code 2. 第二步,node服务器向微信服务器发起第二次签名,小程序端无感知 //二次签名 const paysign2 = { appId: result.appid, nonceStr: result.nonce_str, package: `prepay_id=${result.prepay_id}`, timeStamp: parseInt((Date.now() / 1000)).toString(), //注意:时间必须为秒 signType: 'MD5' } paysign2.paySign = ctx.helper.getPreSign(paysign2, merchantkey) const data = { paysign2, orderid } await ctx.model.Ordertable.create({ orderid, openid, money: totalmoney * 100, status: 0 }) //在这里我做了一个支付预处理落地到数据库的操作,当预支付 return data } 在这里我做了一个支付预处理落地到数据库的操作,当预支付通过,支付数据库插入一条status为0的待确认支付状态的数据1.第二步,第二次签名中的回调数据,一起通过接口返回给小程序端 async wxappay (openid, money) { return new Promise(async (resolve, reject) => { let Objct = { openid, //拉取授权获取到的openid money, //money必须是整数类型, 以RMB分为单位! body: 'xxx' } let temp = await wxappWxPay(obj) //进入到第一阶段, 预支付阶段 //前面的逻辑为第一阶段 //下面的逻辑为第二阶段 //第二次签名 let einfo = temp.data //小程序使用wx.requestPayment拉去支付逻辑 wx.requestPayment({ timeStamp: parseInt(einfo.paysign2.timeStamp).toString(), nonceStr: einfo.paysign2.nonceStr, package: einfo.paysign2.package, signType: 'MD5', paySign: einfo.paysign2.paySign, success: async res => { if (res) { let checkdata = { nonceStr: einfo.paysign2.nonceStr, out_trade_no: einfo.orderid, sign: einfo.paysign2.paySign } //下面是第四步,省略... } }, fail: res => { console.log('@', res) reject(res) } }) } }) } 注意, wx.requestPayment的回调success , 并不一定获取到正确结果,严谨的说。由于发起支付后,后端(node) 发送成功支付后,微信服务器会要求后端进行支付成功数据回调的响应。微信支付的官方说明如下:1.第三步 回调 notify_url填写注意事项•notify_url需要填写商户自己系统的真实地址,不能填写接口文档或demo上的示例地址。•notify_url必须是以https://或http://开头的完整全路径地址,并且确保url中的域名和IP是外网可以访问的,不能填写localhost、127.0.0.1、192.168.x.x等本地或内网IP。•notify_url不能携带参数。[图片]1.node服务器中回调地址代码如图: /** * 确认支付之后的订单 * 回调(微信)再次签名(响应支付成功的结果) * @param {Object} * 1.必须给微信一个响应。支fu的结果, * */ async wxPayNotify(xmldata) { const { ctx } = this let result = await ctx.helper.xmlToJson(xmldata) if (result) { let resxml = ' ' + '' + '' + '' + '' + '' + '' + ' ' if (result.result_code == 'SUCCESS') { await ctx.model.Ordertable.update({ status: 1, transactionid: result.transaction_id, money: result.total_fee }, { where: { orderid: result.out_trade_no, openid: result.openid } }) } return resxml } } > 在这里我上面落地存储数据的支付表,在收到微信的支付成功的回调后,将状态status :0 改为1 表示支付明确 6. 第四步 主动查询 > 由于微信的回调是异步,前端不可能等待微信的回调再来进行下一步逻辑处理,万一网络波动或者其他因素导致微信服务器的回调迟迟没有到我们的数据库中来呢?所以我们需要自己主动发起查询支付结果的API > 此API为:[微信查询支付接口](https://api.mch.weixin.qq.com/pay/orderquery) > 小程序端发起查询请求给后端,后端再向微信服务器调取查询结果: > node服务器的代码如下:(本次逻辑十分重要,关系我们支付的闭环) /** * 微信支付主动调取查询订单状态API */ async checkWxPayResult(obj) { const { ctx, config } = this const { appid, merchantid, merchantkey } = config.wxapp const { nonceStr, out_trade_no } = obj let Params = { appid, mch_id: merchantid, nonce_str: nonceStr, out_trade_no: out_trade_no } Params.sign = ctx.helper.getPreSign(Params, merchantkey) let xml = ''; const temp = await ctx.curl('https://api.mch.weixin.qq.com/pay/orderquery', { method: 'POST', data: xml }) let result = {} if (temp.status == 200) { result = await ctx.helper.xmlToJson(temp.data.toString()) return result } } 7. 将响应结果发送给小程序端 + 小程序端支付的完整逻辑就呈现出来了,代码如下: async wxappay (openid, money) { return new Promise(async (resolve, reject) => { let Objct = { openid, //拉取授权获取到的openid money, //money必须是整数类型, 以RMB分为单位! body: 'xxx' } let temp = await wxappWxPay(obj) //进入到第一阶段, 预支付阶段 //前面的逻辑为第一阶段 //下面的逻辑为第二阶段 //第二次签名 let einfo = temp.data //小程序使用wx.requestPayment拉去支付逻辑 wx.requestPayment({ timeStamp: parseInt(einfo.paysign2.timeStamp).toString(), nonceStr: einfo.paysign2.nonceStr, package: einfo.paysign2.package, signType: 'MD5', paySign: einfo.paysign2.paySign, success: async res => { if (res) { //虽然是res调取成功,但是我们并不需要这个参数的逻辑回调 let checkdata = { nonceStr: einfo.paysign2.nonceStr, out_trade_no: einfo.orderid, sign: einfo.paysign2.paySign } //下面是第四步,主动查询订单的支付情况 const result = await getWxappPayResult(checkdata) if (result.code == 200) { resolve(result.data) //最后,作为promise进行返回,此刻的支付是100%正确的。还可以参照落地的数据库表进行辅助对照 } } }, fail: res => { console.log('@', res) reject(res) } }) } }) } ``` 至此,小程序的支付就完成了。后续,此文仅仅是使用的node 作为后端, 实际上流程来说,JAVA,PHP等等语言来说,逻辑思路都基本一致的。[图片] 原创不易,喜欢的朋友麻烦点点关注!后续会写java版本的支付流程 ,敬请关注References[代码][1][代码] 微信支付页链接地址: https://pay.weixin.qq.com/
2020-04-29 - wx.requestPayment没有回调?
[图片] 支付点完成之后,回调没有输出内容
2020-11-17 - 订单金额或退款金额与之前请求不一致,请核实后再试
该传的参数都是对的,商户收到的金额也是108,为什么就失败呢。但是过段时间退款又可用了。请问如果是 out_refund_no不唯一,在微信商户如何查看已经使用过的商户退款单号 <out_trade_no>3060</out_trade_no> <out_refund_no>115</out_refund_no> <total_fee>10800</total_fee> <refund_fee>10800</refund_fee>
2020-10-29