Laravel 使用EasyWechat 进行微信支付流程

1,938 阅读3分钟

小白一个,调用微信的东西的时候,总是觉得微信那边的设置真的是很麻烦,而且网上的教程也是这个讲那部分,那个讲另外一部分,属实很烦,所以写个记录,以后要用也方便一些

目录

  • 准备工作
  • 代码编写
  • 测试完成

准备工作

准备工作其实还算是蛮多的,这里主要是以公众号支付,也是就JSAPI为主,其他的还是要看微信的官方文档来配置.

1 申请相关的权

首先还是需要确定自己的账是否已经申请微信支付的权限了 进入微信支付官网
在产品中心查看当前是否已经具有权限,可以看到下面没有权限的全部是未开通,点击之后会有相应的流程,先开通这个

然后就是需要跟你公众号进行关联,关联完成之后如下图所示

整个申请的流程大概需要2天左右.

2 微信相关配置

首先是在开发配置中,对进来之后,有两点需要注意:
第一是商户信息,这个商户号要记录下来,之后需要用到这个

第二是下面的这里

注意,这里有个坑,微信的文档里面有提到,现在已经支持配置到了根目录下,也就是说,如果你的网站是 xxx.com ,就直接配置到xxx.com就行了,但是我试过之后又发现不行,还是得具体到某一个目录下,例如我的支付目录是 xxx.com/order/pay,那就把这个填进去就可以了,但是你的域名必须是通过备案的了,不然就无法使用的

第三 下载证书,获取密钥

在账户中心,API安全中,我们需要用到Api秘钥里面的证书跟密钥,证书是直接下载的一些文件,秘钥是32位的,需要自己去生成

3 开发

1 配置 easyWechat

Laravel 使用的是 laravel-wechat,进入github根据提示安装就可以了
安装完成之后,在项目的 app/config中,会有一个wecaht.php的文件,这个文件就是easyWechat的配置文件,首先配置一下微信支付

 /*
     * 微信支付
     */
     'payment' => [
         'default' => [
             'sandbox'            => xxx,
             'app_id'             => xxx,
             'mch_id'             => xxx,
             'key'                => xxx,
             'cert_path'          => "./cert/apiclient_cert.pem",    // XXX: 绝对路径!!!!
             'key_path'           => "./cert/apiclient_key.pem",      // XXX: 绝对路径!!!!
             'notify_url'         => xxx,                           // 默认支付结果通知地址,也就是回调地址,
         ],
         // ...
     ],

配置中的notify_url,是支付完成之后,微信会向后台发送的请求地址,可以在里面进行相关的操作,但是要注意的是,这个地址必须为完全可以外部访问,也就是说,不能带有任何限制,连限制只能在微信中打开都不行.

2 进行微信支付

这里必须使用的Factory::payment(config),其他的都报错 下单&& 支付

public function wxPlay($order)
    {
        $app = Factory::payment(config("wechat.payment.default"));
        // 支付配置
        $result = $app->order->unify([
            'body' => "商品标题",
            'out_trade_no' => 订单号,
            'total_fee' => 1,                  // 支付金额 这里注意是按分算的, 1 = 0.1
//          'notify_url' => '', // 支付结果通知网址,如果不设置则会使用配置里的默认地址
            'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型
            'openid' => 对应用户的OPENID, 
        ]);
 

        // 二次签名 下单之后必须进行
        if (isset($result['return_code']) && $result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') {
            $jssdk = $app->jssdk;
            //预支付订单号prepayId, 生成支付 JS 配置
            $config = $jssdk->sdkConfig($result['prepay_id']);

            // 返回给前端 返回的格式可自己定义
            return $this->returnSuccess($config);
        }
    }

支付完成回调

public function payNotifyWechat(Request $request)
    {
        $app = Factory::payment(config("wechat.payment.default"));
        $response = $app->handlePaidNotify(function ($message,$fail){
            if ($message['return_code'] === 'SUCCESS') {
                if (array_get($message, 'result_code') === 'SUCCESS') {
                    // 用户支付成功
                } elseif (array_get($message, 'result_code') === 'FAIL') {
                    return $this->error('支付失败',400);
                }

            } else {
                return $fail('通信失败,请稍后再通知我');
            }
        });
        return $response;
    }

到这里,微信支付就完成了.