扫码支付(模式一)

优质
小牛编辑
132浏览
2023-12-01

说明

微信扫码支付(模式一)SDK。

不通过接口,直接生成以weixin://开头的url,并生成二维码让用户扫描。

用户支付后,公众平台后台设置的支付回调URL会接收到消息。

官方文档: https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_4 https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1

请求参数类

生成url的参数

类名:\Yurun\PaySDK\Weixin\Native\Params\Pay\Mode1Request

属性
名称类型说明
$_apiMethodstring接口名称
$product_idstring商户定义的商品id 或者订单号
$time_stampint系统当前时间
$needSignTypeboolean参数中需要带有sign_type
$allowReportboolean是否允许上报
$_methodstring接口请求方法
$_isSyncVerifyboolean是否同步返回验证

支付参数

类名:\Yurun\PaySDK\Weixin\Native\Params\Pay\Request

属性
名称类型说明
$scene_info\Yurun\PaySDK\Weixin\Native\Params\SceneInfo场景信息
$_apiMethodstring接口名称
$device_infostring终端设备号(门店号或收银设备ID),注意:PC网页或公众号内支付请传"WEB"
$bodystring商品简单描述,该字段须严格按照规范传递,具体请见https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=4_2
$detail\Yurun\PaySDK\Weixin\Params\Detail商品详细描述,对于使用单品优惠的商户,改字段必须按照规范上传,详见https://pay.weixin.qq.com/wiki/doc/api/danpin.php?chapter=9_102&index=2
$attachstring附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
$out_trade_nostring商户系统内部的订单号,32个字符内、可包含字母, 其他说明见https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=4_2
$fee_typestring符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_2
$total_feestring订单总金额,单位为分,详见https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=4_2
$spbill_create_ipstring必须传正确的用户端IP
APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP。
$time_startstring订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。
$time_expirestring订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。
注意:最短失效时间间隔必须大于5分钟
$goods_tagstring订单优惠标记(商品标记)
商品标记,代金券或立减优惠功能的参数,说明详见https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_1
$notify_urlstring异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。
$trade_typestring交易类型,取值如下:JSAPI,NATIVE,APP等
$limit_paystring指定支付方式
no_credit--指定不能使用信用卡支付
$needSignTypeboolean参数中需要带有sign_type
$allowReportboolean是否允许上报
$_methodstring接口请求方法
$_isSyncVerifyboolean是否同步返回验证

场景信息

类名:\Yurun\PaySDK\Weixin\Native\Params\SceneInfo

属性
名称类型说明
$idstring门店唯一标识
$namestring门店名称
$area_codestring门店所在地行政区划码,详细见https://pay.weixin.qq.com/wiki/doc/api/download/store_adress.csv
$addressstring门店详细地址

商品详细描述

类名:\Yurun\PaySDK\Weixin\Params\Detail

属性
名称类型说明
$cost_priceint订单原价
1.商户侧一张小票订单可能被分多次支付,订单原价用于记录整张小票的交易金额。
2.当订单原价与支付金额不相等,则不享受优惠。
3.该字段主要用于限定同一张小票多次支付,以享受多次优惠的情况,正常支付订单不必上传此参数。
$receipt_idstring商家小票ID
$goods_detailarray<\Yurun\PaySDK\Weixin\Params\GoodsDetail>单品列表

单品信息

类名:\Yurun\PaySDK\Weixin\Params\GoodsDetail

属性
名称类型说明
$goods_idstring商品编码
$wxpay_goods_idstring微信侧商品编码
$goods_namestring商品名称
$quantityint商品数量
$priceint商品单价

简单使用

生成url

// SDK实例化,传入公共配置
$pay = new \Yurun\PaySDK\Weixin\SDK($params);

// 支付接口
$request = new \Yurun\PaySDK\Weixin\Native\Params\Pay\Mode1Request;
$request->product_id = 'test99999999';

// 调用接口
$pay->prepareExecute($request, $url);
var_dump('qrcode:', $url);

生成短地址(可选)

// 转短地址
$request = new \Yurun\PaySDK\Weixin\Shorturl\Request;
$request->long_url = $url;
$result = $pay->execute($request);
$shortUrl = $result['short_url'];
var_dump($result, $shortUrl);

详见:test/Weixin/Native/mode1.php

模式一回调处理

// SDK实例化,传入公共配置
$sdk = new \Yurun\PaySDK\Weixin\SDK($params);

class PayNotify extends \Yurun\PaySDK\Weixin\Notify\PayMode1
{
    /**
     * 后续执行操作
     * @return void
     */
    protected function __exec()
    {
        // 支付接口
        $request = new \Yurun\PaySDK\Weixin\Native\Params\Pay\Request;
        $request->body = 'test'; // 商品描述
        $request->out_trade_no = 'test' . mt_rand(10000000,99999999); // 订单号
        $request->total_fee = 1; // 订单总金额,单位为:分
        $request->spbill_create_ip = '127.0.0.1'; // 客户端ip
        $request->notify_url = $GLOBALS['PAY_CONFIG']['pay_notify_url']; // 通知地址

        // 调用接口
        try{
            $data = $this->sdk->execute($request);
            $this->replyData->appid = $this->sdk->publicParams->appID;
            $this->replyData->mch_id = $this->sdk->publicParams->mch_id;
            $this->replyData->nonce_str = $data['nonce_str'];
            $this->replyData->prepay_id = $data['prepay_id'];
            $this->replyData->result_code = 'SUCCESS'; // 交易是否成功
            // $this->replyData->err_code_des = ''; // 错误信息
            $this->reply('SUCCESS');
        }catch(Exception $e){
            $this->reply('FAIL', $e->getMessage());
        }
    }
}

$payNotify = new PayNotify;
try{
    $sdk->notify($payNotify);
}catch(Exception $e){
}

详见:test/Weixin/pay_mode1_notify.php