1.安装laravel5.7
composer create-project --prefer-dist laravel/laravel wechat 5.7.*。
2.laravel5.7安装easywechat扩展
composer require overtrue/wechat:~4.0
php artisan vendor:publish --provider="Overtrue\LaravelWeChat\ServiceProvider"
3.申请微信小程序已经微信支付的商户平台以及下载一些证书
(1)注册邮箱,注册微信小程序,根据需求选择服务类目,填写企业信息认证
(2)开通支付功能,注册商户平台账号
(3)在商户平台上设置API秘钥(后面会用到),下载证书
4.配置
(1)小程序配置
WECHAT_MINI_PROGRAM_APPID=小程序AppId
WECHAT_MINI_PROGRAM_SECRET=小程序AppSecret
WECHAT_MINI_PROGRAM_TOKEN=Token(使用客服消息时用到)
WECHAT_MINI_PROGRAM_AES_KEY=Aes_key
(2)修改.env文件,加上以下配置信息
WECHAT_PAYMENT_SANDBOX=false
WECHAT_PAYMENT_APPID=小程序appid
WECHAT_PAYMENT_MCH_ID=商户平台账号
WECHAT_PAYMENT_KEY=设置的API秘钥
WECHAT_PAYMENT_CERT_PATH=xxx证书地址xxx/apiclient_cert.pem(绝对路径)
WECHAT_PAYMENT_KEY_PATH=xxx证书地址xxxapiclient_key.pem(绝对路径)
5.完成配置类
namespace App\Handlers\Wechat;
use EasyWeChat\Factory;
class ConfigHandler
{
//[2-1]微信支付设置
public function pay_config()
{
$config=config('wechat.payment.defaul);
return $config;
}
//[2-2]生成微信支付相关
public function pay()
{
$pay = Factory::payment($this->pay_config());
return $pay;
}
//[3-1]微信小程序设置
public function mini_config($app_name)
{
$config=config('wechat.mini_program.default');
return $config;
}
//[3-2]微信小程序相关
public function miniProgram()
{
$miniProgram = Factory::miniProgram($this->mini_config());
return $miniProgram;
}
}
6.支付功能
use App\Handlers\Wechat\ConfigHandler;
use Illuminate\Support\Facades\Auth;
$auth_user=Auth::user();
$no=生成唯一订单号(自己实现)
$payment = (new ConfigHandler())->pay();
//实例化支付类
$result = $payment->order->unify([
'body' => '随意填写',
'out_trade_no' => $no,
'trade_type' => 'JSAPI', // 必须为JSAPI
'openid' => $auth_user->openid, // 这里的openid为付款人的openid
'total_fee' => (int)($level->price*100), // 总价
]);
// 如果成功生成统一下单的订单,那么进行二次签名
if ($result['return_code'] === 'SUCCESS') {
// 二次签名的参数必须与下面相同
$params = [
'appId' => config('wechat.payment.'.$app_name.'.app_id'),
'timeStamp' => time(),
'nonceStr' => $result['nonce_str'],
'package' => 'prepay_id=' . $result['prepay_id'],
'signType' => 'MD5',
];
$params['paySign'] = generate_sign($params, config('wechat.payment.'.$app_name.'.key'));
//可以在这里向订单表插入订单信息
...
return $this->success($params);
} else {
return $this->failed($result);
}
7.异步通知
$payment = (new ConfigHandler())->pay();
$response = $payment->handlePaidNotify(function ($message, $fail) {
$order = Order::where('order_num', $message['out_trade_no'])->first();
if (!$order || $order->status==2) {
return true;
}
if ($message['return_code'] === 'SUCCESS') {
if (array_get($message, 'result_code') === 'SUCCESS') {
$order->payed_at = Carbon::now();
$order->status = 2;
$order->transaction_id = $message['transaction_id']; //微信交易号
} elseif (array_get($message, 'result_code') === 'FAIL') { // 用户支付失败
$order->status = 3; //支付状态 失败
}
} else {
return $fail('通信失败,请稍后再通知我');
}
$order->save(); // 保存订单
return true; // 返回处理完成
});
8.路由配置
(1)支付路由:需在登录接口之后,
(2)通知路由:需要用any方式接受(包含get和post),不带参数,没有权限验证