2020-05-20 18:06:00
围观(4295)
安装 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 生成一个二维码, 再打开手机微信扫码, 可以发现已经能够成功支付了.
顺便说一下
如果需要退款功能, 只需要在配置里面加入证书文件然后根据 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
版权声明 : 未经允许禁止转载!
上一篇文章: 使用Layui和Laravel开发商品多规格录入
下一篇文章: 使用Think PHP6 的验证器验证请求参数