3分钟实现小程序唤起微信支付 Laravel教程

你。 提交于 2021-02-10 08:14:52

<p>微信支付的接入,如果不使用成熟的开发包,将是巨大的工作量。</p> <h1>依赖 EasyWechat</h1> <p>先在 laravel 项目中依赖 <code>easywechat</code> 这个包</p> ```composer require "overtrue/laravel-wechat":"^4.0" ```

<p>配置 <br>在 .env 中添加微信支付的 key 配置</p> ``` WECHAT_PAYMENT_SANDBOX=false WECHAT_PAYMENT_APPID=wx64c*** WECHAT_PAYMENT_MCH_ID=150*** WECHAT_PAYMENT_KEY=ZZDDD*** WECHAT_PAYMENT_CERT_PATH=/home/secret/apiclient_cert.pem WECHAT_PAYMENT_KEY_PATH=/home/secret/apiclient_key.pem WECHAT_PAYMENT_NOTIFY_URL=https://www.mysite.com/gateway/wxpay/callback ```

<ul><li>如果你需要额外的配置,可以运行 <code>php artisan vendor:publish --provider="Overtrue\LaravelWeChat\ServiceProvider"</code> ,然后在 config/wechat.php 中可以看到 easywecaht 可以支持的全部配置。</li></ul> <h1>编写接口逻辑</h1> <p>新建一个 App/Repositories/PayRepository.php</p>

&lt;?php
namespace App\Repositories;

use App\User;
use function EasyWeChat\Kernel\Support\generate_sign;

class PayRepository
{
    /**
     * 发起微信支付
     *
     * @return Array
     */
    public function pay(User $user)
    {
        $this-&gt;wxpay = app('easywechat.payment');

        $unify = $this-&gt;wxpay-&gt;order-&gt;unify([
            'body' =&gt; $this-&gt;transfer-&gt;name . ' ' . $this-&gt;tickets-&gt;count() . '张票',
            'out_trade_no' =&gt; '订单号',
            'total_fee' =&gt; bcmul('价格:单位元', 100),
            'trade_type' =&gt; 'JSAPI',
            'openid' =&gt; $user-&gt;openid, // 用户的openid
        ]);

        if ($unify['return_code'] === 'SUCCESS' &amp;&amp; !isset($unify['err_code'])) {
            $pay = [
                'appId' =&gt; config('wechat.payment.default.app_id'),
                'timeStamp' =&gt; (string) time(),
                'nonceStr' =&gt; $unify['nonce_str'],
                'package' =&gt; 'prepay_id=' . $unify['prepay_id'],
                'signType' =&gt; 'MD5',
            ];

            $pay['paySign'] = generate_sign($pay, config('wechat.payment.default.key'));

            return $pay;
        } else {
            $unify['return_code'] = 'FAIL';
            return $unify;
        }
    }
}

<p>新建一个 App/Http/Controllers/PayController.php</p>

&lt;?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Repositories\PayRepository;
use Illuminate\Support\Facades\Response;

class PayController extends Controller
{
    /**
     * PayRepository
     *
     * @var PayRepository
     */
    protected $pay_repository;

    public function __construct(PayRepository $pay_repository)
    {
        $this-&gt;pay_repository = $pay_repository;
    }

    /**
     * 微信支付
     *
     * @return Response
     */
    public function pay()
    {
        $user = auth()-&gt;user();

        $pay = $this-&gt;pay_repository-&gt;pay($user);
        return Response::success(['pay' =&gt; $pay]);
    }
}

<p>绑定路由 routes/api.php</p>

&lt;?php
Route::post('/buy/pay', 'PayController@pay')-&gt;name('pay');

<h1>编写JS逻辑</h1> <p>在页面 JS 里面编辑支付逻辑</p> ``` onPay: function (e) { wx.request({ url: '/api/buy/pay', method: 'POST', success: (res) =&gt; { if (res.data.pay.result_code != 'SUCCESS') { return wx.showModal({ content: res.data.pay.return_msg + res.data.pay.err_code_des, showCancel: false }); } res.data.pay.success = (res) =&gt; { wx.showModal({ content: '您已成功支付', showCancel: false }); };

            res.data.pay.fail = (res) =&gt; {
                if (res.errMsg == 'requestPayment:fail cancel') {
                    return wx.showToast({
                        icon: 'none',
                        title: '用户取消支付',
                    });
                }
            };

            wx.requestPayment(res.data.pay);
        }
    });
},

<p>在页面按钮上调用</p>
```&lt;button ontap="onPay"&gt;支付&lt;/button&gt;

<h1>效果</h1>

<h1>支付成功回调</h1> <p>关于回调处理请期待下一篇文章。</p>

原文地址:https://segmentfault.com/a/1190000016177743

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!