Laravel5.7+Easywechat4.0开发微信小程序支付功能

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),不带参数,没有权限验证

更多功能可以参考easywechat官网,以及https://github.com/overtrue/wechat

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值