账户中心 退出系统
开发文档 资讯·分享 技术交流 会员登录
phpGrace GSCMS 公众号系统
扫码支付

扫码支付流程


(1)商户后台系统根据用户选购的商品生成订单。

(2)用户确认支付后调用微信支付【统一下单API】生成预支付交易;

(3)微信支付系统收到请求后生成预支付交易单,并返回交易会话的二维码链接code_url。

(4)商户后台系统根据返回的code_url生成二维码。

(5)用户打开微信“扫一扫”扫描二维码,微信客户端将扫码内容发送到微信支付系统。

(6)微信支付系统收到客户端请求,验证链接有效性后发起用户支付,要求用户授权。

(7)用户在微信客户端输入密码,确认支付后,微信客户端提交授权。

(8)微信支付系统根据用户授权完成支付交易。

(9)微信支付系统完成支付交易后给微信客户端返回交易结果,并将交易结果通过短信、微信消息提示用户。微信客户端展示支付交易结果页面。

(10)微信支付系统通过发送异步消息通知商户后台系统支付结果。商户后台系统需回复接收情况,通知微信后台系统不再发送该单的支付通知。

(11)未收到支付通知的情况,商户后台系统调用【查询订单API】。

(12)商户确认订单已支付后给用户发货。

配置设置

<?php
// 微信开发配置
return array(
    /* -------- 微信支付 [ 扫码支付 ] 需要的配置 -------- */
    'NATIVE'        => array(
        // 与微信支付绑定的公众号或小程序 app id
        'appid'   => 'wx***8',
        // 微信支付商户ID
        'mchid'   => '15***1',
        // 微信支付对应的KEY
        'key'     => 'mpxtarou6***'
    ),

示例源码

<?php
require_once PG_IN.'vendor'.PG_DS.'autoload.php';
use Endroid\QrCode\Color\Color;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelLow;
use Endroid\QrCode\QrCode;
use Endroid\QrCode\Label\Label;
use Endroid\QrCode\Logo\Logo;
use Endroid\QrCode\RoundBlockSizeMode\RoundBlockSizeModeMargin;
use Endroid\QrCode\Writer\PngWriter;
class wxPayController extends grace{

    public function index(){
        /*
         * 微信支付后端示例代码
         * 模拟一个1元的支付信息,真实环境可以利用订单数据来产生下面的order数据
         */
        //模拟一个简单的订单信息
        $order = array(
            'id'         => mt_rand(111111111,999999999),     // 订单号码
            'price'      => 2           // 订单价格
        );
        //使用统一下单接口返回微信支付前端必须的信息
        $orderWxPay                  = array();
        $orderWxPay['body']         = '支付描述'; //支付描述
        //商户系统内部订单号,要求32个字符内
        $orderWxPay['out_trade_no'] = 'NATIVE-'.$order['id'];
        //总价,需要 * 100
        $orderWxPay['total_fee']    = $order['price'];
        //异步接收微信支付结果通知的回调地址
        $orderWxPay['notify_url']   = 'https://域名/wxPay/payback/';
        //实例化微信支付对象
        $graceWeChat    = new \phpGrace\tools\graceWeChat();
        $graceWeChatPay = new \phpGrace\tools\graceWeChat\pay($graceWeChat);
        //生成订单
        $res = $graceWeChatPay->createOrder($orderWxPay, 'NATIVE');
        // 失败 Array ( [return_code] => FAIL [return_msg] => appid不存在 )
        // 成功 Array ( [return_code] => SUCCESS [return_msg] => OK ...  [code_url] => weixin://wxpay/bizpayurl?pr=zgYRjTjzz )
        // 生成二维码
        if(!empty($res['code_url'])){
            $writer = new PngWriter();
            // 绘制二维码
            $qrCode = QrCode::create($res['code_url'])
                ->setEncoding(new Encoding('UTF-8'))
                ->setErrorCorrectionLevel(new ErrorCorrectionLevelLow())
                ->setSize(300)
                ->setMargin(10)
                ->setRoundBlockSizeMode(new RoundBlockSizeModeMargin())
                ->setForegroundColor(new Color(0, 0, 0))
                ->setBackgroundColor(new Color(255, 255, 255));
            $result = $writer->write($qrCode);
            // 保存二维码
            $qrCodeFileName = uniqid().'.png';
            $result->saveToFile($qrCodeFileName);
            // 输出二维码到页面
            echo '<img src="'.$qrCodeFileName.'" />';
        }
    }

    // 支付成功后微信支付服务器异步通知接口
    // 根据通知结果处理订单状态等后续工作
    public function payback(){
        $graceWeChat    = new \phpGrace\tools\graceWeChat();
        $graceWeChatPay = new \phpGrace\tools\graceWeChat\pay($graceWeChat);
        $res = $graceWeChatPay->payBack('NATIVE');
        // 将 res 数组与数据库内订单信息进行比对,比对后进行后续操作,如:更新订单、发送通知......
        file_put_contents('pay.txt', json_encode($res, JSON_UNESCAPED_UNICODE));
        echo '<xml> 
        <return_code><![CDATA[SUCCESS]]></return_code>
        <return_msg><![CDATA[OK]]></return_msg>
      </xml>';
    }
}