微信扫描支付总结
用户扫描商户展示在各种场景的二维码进行支付。
步骤1:商户根据微信支付的规则,为不同商品生成不同的二维码,展示在各种场景,用于用户扫描购买。
步骤2:用户使用微信“扫一扫”扫描二维码后,获取商品支付信息,引导用户完成支付。
1.统一下单
除被扫支付场景以外,商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易回话标识后再按扫码、JSAPI、APP等不同场景生成交易串调起支付。
URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder
官网的参数:
公众账号ID appid
商户号 mch_id
设备号 device_info PC网页或公众号内支付请传"WEB"
随机字符串 nonce_str
签名 sign
以上五个参数基本是公有的,前三个是固定的。
商品描述 body
商户订单号 out_trade_no
总金额 total_fee
终端IP spbill_create_ip
通知地址 notify_url
交易类型 trade_type JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付
以上的所有参数都是必须要用到的。
商品ID product_id trade_type=NATIVE,此参数必传。此id为二维码中包含的商品ID,商户自行定义
这个是根据trade_type来决定是否必传的。
商品描述 detail 商品或支付简要描述
附加数据 attach 在查询API和支付通知中原样返回,该字段主要用于商户携带订单自定义数据
货币类型 fee_type 货币类型,符合ISO 4217标准的三位字母代码默认是CNY,人民币
交易起始时间 time_start 订单生成时间,格式为yyyyMMddHHmmss
交易结束时间 time_expire 格式同上,最短失效时间间隔必须大于5分钟
商品标记 goods_tag 商品标记,代金券或立减优惠功能的参数。
指定支付方式 limit_pay no_credit 指定不能使用信用卡支付。
用户标识 openid trade_type=JSAPI ,必传,用户在商户appid下的唯一标识
这些参数都是可以选择性的使用的。
可以根据自己的需求,对于不同的类型封装一下即可。
下面记录一下自己做的,PC网页扫描支付,需要的参数最多大概是以下这些:
①appid,mch_id,device_info,nonce_str(随机字符串,写个函数即可),trade_type这5个参数是固定的
②out_trade_no,product_id,body,total_fee,spbill_create_ip,notify_url这个6个参数是必须有的,在这里要注意这些字段的长度限制
③detail,attach这两个参数可以选填
2.签名函数和随机数函数
1 2 3 | private function nonce_str(){ return strtoupper (md5(mt_rand())); } |
签名函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | private function sign( $data ){ $stringA = "" ; // 按照参数名排序 ksort( $data ); // 非空参数拼接 foreach ( $data as $key => $value ) { if ( $value ){ $stringA .= "&" . $key . "=" . $value ; } } // 加上商户的key $stringA .= "&key=" . $this ->mch_key; // MD5 加密 $signValue = md5( substr ( $stringA , 1)); // 返回大写 return strtoupper ( $signValue ); } |
将1中准备的参数,使用2中的算法整理,再添加到参数列表中。下单参数就整理完毕了。
3.将数组转为xml
微信开发中,一般提交的数据格式都是xml格式的,php一般都是先做成数组,在转换。
1 2 3 4 5 6 7 8 9 10 11 12 | private function arr2xml( $arr ){ if (! is_array ( $arr )){ $arr = ( array ) $arr ; } // 建立xml<br> $dom = new DOMDocument("1.0");<br> // 增加根节点 $item = $dom ->createElement( "xml" ); <br> $dom ->appendChild( $item ); <br><br> foreach ( $arr as $key => $val ){<br> // 使用键名建立xml节点 $itemx = $dom ->createElement( is_string ( $key )? $key : "item" ); $item ->appendChild( $itemx ); // 将值加入节点 $text = $dom ->createTextNode( $val ); <br> $itemx ->appendChild( $text ); }<br> return $dom ->saveXML();<br>} |
使用curl提交,获取结果即可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用