微信小程序支付 + laravel

使用easywechat

demo:

<?php

namespace App\Modules\Mall\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use DB;
use App\Wxconfig;

/*小程序支付*/

class PayController extends Controller
{
    protected $pay;
    protected $gid;
    protected $wxconfig;

    public function __construct(Wxconfig $wxconfig, Request $request)
    {
        $this->gid = $request->input('gid');
        if ($this->gid) {
            $this->wxconfig = $wxconfig;
            $this->pay = $this->wxconfig->WxMiniPay($this->gid);
        } else {
            exit('gid no exist');
        }
    }

    public function pay(Request $request)
    {
        $jssdk = $this->pay->jssdk;

        $openid = $request->input('openid');
        $order_no = 'O' . time() . rand(10000, 99999);

        $order = DB::table('goods_orders')->where('order_no', 'O157066840848073')->first();

        $result = $this->pay->order->unify([
            'body' => '测试小程序微信支付',
            'out_trade_no' => $order->order_no,
            'total_fee' => 1,//总价
            'notify_url' => 'http://' . $_SERVER['SERVER_NAME'] . '/mall/api/payNotify',   // 支付结果通知网址,如果不设置则会使用配置里的默认地址
            'trade_type' => 'JSAPI',
            'openid' => $openid,
        ]);

        if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') {
            $prepayId = $result['prepay_id'];
            $pay_config = $jssdk->sdkConfig($prepayId);
            return $pay_config;
        } else {
            return '签名错误';
        }
    }

    public function payNotify()
    {
        $response = $this->pay->handlePaidNotify(function ($message, $fail) {
            // 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单
            $order = DB::table('goods_orders')->where('order_no', $message['out_trade_no'])->first();

            //订单不存在或者订单已支付
            if (!$order || $order->pay_time) {
                return true;
            }
            if ($message['return_code'] === 'SUCCESS') { // return_code 表示通信状态,不代表支付状态
                if (array_get($message, 'result_code') === 'SUCCESS') { // 用户是否支付成功
                    $order_data = [
                        'pay_time' => time(),
                        'pay_status' => 2,
                        'transaction_id' => $message['transaction_id'],  //微信交易号
                    ];
                    // $order->pay_time = time(); // 更新支付时间为当前时间
                    // $order->pay_status = 20;    //支付状态 成功
                    // $order->transaction_id = $message['transaction_id'];  //微信交易号
                } elseif (array_get($message, 'result_code') === 'FAIL') {  // 用户支付失败
                    $order['pay_status'] = 3; //支付状态 失败
                }
            } else {
                return $fail('通信失败,请稍后再通知我');
            }
            $order = DB::table('goods_orders')->where('order_no', $message['out_trade_no'])->update($order_data); // 保存订单
            return true; // 返回处理完成
        });
        return ['code' => 1, 'msg' => '订单支付成功!', 'data' => $response];
    }

    public function orderPayResult(Request $request)
    {
        $order_no = $request->post('order_no');
        //根据商品订单号查询
        $wx_order = $this->wxpay->order->queryByOutTradeNumber($order_no);
        if ($wx_order && $wx_order['trade_state'] === 'SUCCESS') {
            return ['code' => 1, 'msg' => '交易成功!'];
        }
        return ['code' => 0, 'msg' => '支付失败!', 'data' => $wx_order];
    }


}

小程序端

//支付接口
paypay: function() {
    var openid = wx.getStorageSync('openid');
    var api = this.globalData.api;
    var gid = this.globalData.gid;
    console.log(openid) wx.request({
        url: api + '/pay',
        data: {
            gid: gid,
            openid: openid,
            //order_id: order_id//订单ID
        },
        method: 'POST',
        header: {
            'content-type': 'application/json'
        },
        success: function(res) {
            console.log(res.data);
            wx.requestPayment({
                'timeStamp': res.data.timestamp,
                'nonceStr': res.data.nonceStr,
                'package': res.data.package,
                'signType': res.data.signType,
                'paySign': res.data.paySign,
                'success': function(res) {
                    if (res.errMsg == "requestPayment:ok") {
                        wx.showToast({
                            title: '支付成功'
                        })
                    }
                },
                'fail': function(res) {

}
            })
        },
        fail: function(res) {
            console.log(res.data.errmsg);
            console.log(res.data.errcode);
        },
        complete: function(res) {}
    })
},