微信扫描支付总结

用户扫描商户展示在各种场景的二维码进行支付。

步骤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提交,获取结果即可。

posted @   sundong_wyz  阅读(426)  评论(0编辑  收藏  举报
编辑推荐:
· 深入理解 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 构建精确任务处理应用
点击右上角即可分享
微信分享提示