不败君

前端萌新&初级后端攻城狮

Laravel使用EasyWechat开发微信支付

Laravel使用EasyWechat开发微信支付

2020-05-20 18:06:00

围观(2942)

安装 Laravel

使用命令行安装:

composer create-project --prefer-dist laravel/laravel wechat_pay 7.*

安装代码其实还可以更简短, 只是博主习惯使用这个.


安装 EasyWechat

使用命令安装:

composer require overtrue/wechat:~4.0 -vvv

当然, 可以到官方文档 https://www.easywechat.com/docs/4.1/installation 查看更多安装方法及命令.


入口

在 Web.php 定义一个路由, 如:

Route::get('pay', 'PayController@pay');

使用命令创建控制器:

php artisan make:controller PayController


支付

需要先配置支付, 将支付信息写入数组. 可查看官方文档: https://www.easywechat.com/docs/4.1/payment/index

配置支付后, 使用 "统一下单". 文档: https://www.easywechat.com/docs/4.1/payment/order


控制器完整代码:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use EasyWeChat\Factory;

class PayController extends Controller
{
    public function pay()
    {
        $config = [
            // 必要配置
            'app_id' => 'xxxxxx',
            'mch_id' => 'xxxxxx',
            'key' => 'xxxxxx',   // API 密钥

            // 如需使用敏感接口(如退款、发送红包等)需要配置 API 证书路径(登录商户平台下载 API 证书)
            'cert_path'          => 'path/to/your/cert.pem', // XXX: 绝对路径!!!!
            'key_path'           => 'path/to/your/key',      // XXX: 绝对路径!!!!

            'notify_url'         => '默认的订单回调地址',     // 你也可以在下单时单独设置来想覆盖它
        ];

        $app = Factory::payment($config);

        $result = $app->order->unify([
            'body' => '商品测试',
            'out_trade_no' => time(),
            'total_fee' => 1,
            'spbill_create_ip' => Request()->getClientIp(), // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址
            'notify_url' => 'https://www.bubaijun.com/wxpay/pay_action', // 支付结果通知网址,如果不设置则会使用配置里的默认地址
            'trade_type' => 'NATIVE', // 请对应换成你的支付方式对应的值类型
            // 'openid' => 'oUpF8uMuAJO_M2pxb1Q9zNjxxxxx',
        ]);

        return $result;
    }
}

访问定义好的入口, 可看到返回了一段 JSON(内容已修改 仅作为演示):

{
    "return_code": "SUCCESS",
    "return_msg": "OK",
    "appid": "xxxxxx",
    "mch_id": "xxxxxx",
    "nonce_str": "CxxxxxxCmR8oiRx6",
    "sign": "392E27xxxxxx81E646C98DFA6",
    "result_code": "SUCCESS",
    "prepay_id": "wx2011xxxxxxef0b6be1980720700",
    "trade_type": "NATIVE",
    "code_url": "weixin://wxpay/bizpayurl?pr=ty0xxxxxxC"
}


支付回调

再定义一个路由入口(API):

Route::get('wxpay/pay_action', 'PayActionController@action');

创建控制器:

php artisan make:controller PayActionController

写入代码(可看文档 https://www.easywechat.com/docs/4.1/payment/notify):

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use EasyWeChat\Factory;

class PayActionController extends Controller
{
    public function action()
    {
        $config = [
            // 必要配置
            'app_id' => 'xxxxxx',
            'mch_id' => 'xxxxxx',
            'key' => 'xxxxxx',   // API 密钥

            // 如需使用敏感接口(如退款、发送红包等)需要配置 API 证书路径(登录商户平台下载 API 证书)
            'cert_path'          => 'path/to/your/cert.pem', // XXX: 绝对路径!!!!
            'key_path'           => 'path/to/your/key',      // XXX: 绝对路径!!!!

            'notify_url'         => '默认的订单回调地址',     // 你也可以在下单时单独设置来想覆盖它
        ];

        $app = Factory::payment($config);

        $response = $app->handlePaidNotify(function($message, $fail){
            // 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单
            // 如果订单不存在 或者 订单已经支付过了
            // 告诉微信,我已经处理完了,订单没找到,别再通知我了

            ///////////// <- 建议在这里调用微信的【订单查询】接口查一下该笔订单的情况,确认是已经支付 /////////////

            if ($message['return_code'] === 'SUCCESS') { // return_code 表示通信状态,不代表支付状态
                // 用户是否支付成功
                if (array_get($message, 'result_code') === 'SUCCESS') {
                    // 更新支付时间为当前时间
                } elseif (array_get($message, 'result_code') === 'FAIL') {
                    // 用户支付失败
                }
            } else {
                return $fail('通信失败,请稍后再通知我');
            }

            // 更新订单状态之类的信息后 保存一下

            return true; // 返回处理完成
        });

        return $response;
    }
}

在回调里面写修改订单状态之类的业务逻辑即可, 如果仔细查看上面代码, 可以看到 $config 数组是重复定义了, 所以这个配置是可以重复使用不需要再次定义的.


测试

将统一下单发起支付返回的 code_url 生成一个二维码, 再打开手机微信扫码, 可以发现已经能够成功支付了.

1.jpg


顺便说一下

如果需要退款功能, 只需要在配置里面加入证书文件然后根据 EasyWechat 文档去开发就行了.

其实本文大部分代码都是来自原文档, 所以其实看文档就能使用了: www.easywechat.com

还要注意一下支付方式 trade_type 字段. 根据不同的应用场景需要传不同的值, 例如可选值有 JSAPI / NATIVE / APP. JSAPI 就必须传用户的 Openid , 具体可看微信官方文档:

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_2


本文地址 : bubaijun.com/page.php?id=183

版权声明 : 未经允许禁止转载!

评论:我要评论
发布评论:
Copyright © 不败君 粤ICP备18102917号-1

不败君

首 页 作 品 微 语