Laravel教程: 3分钟实现小程序微信支付接入(上)——唤起支付

微信支付的接入,如果不使用成熟的开发包,将是巨大的工作量。

依赖 EasyWechat

先在 laravel 项目中依赖 easywechat 这个包

composer require "overtrue/laravel-wechat":"^4.0"

配置
在 .env 中添加微信支付的 key 配置

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
  • 如果你需要额外的配置,可以运行 php artisan vendor:publish --provider="Overtrue\LaravelWeChat\ServiceProvider" ,然后在 config/wechat.php 中可以看到 easywecaht 可以支持的全部配置。

编写接口逻辑

新建一个 App/Repositories/PayRepository.php

<?php
namespace App\Repositories;

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

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

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

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

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

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

新建一个 App/Http/Controllers/PayController.php

<?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->pay_repository = $pay_repository;
    }

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

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

绑定路由 routes/api.php

<?php
Route::post('/buy/pay', 'PayController@pay')->name('pay');

编写JS逻辑

在页面 JS 里面编辑支付逻辑

    onPay: function (e) {
        wx.request({
            url: '/api/buy/pay',
            method: 'POST',
            success: (res) => {
                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) => {
                    wx.showModal({
                        content: '您已成功支付',
                        showCancel: false
                    });
                };

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

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

在页面按钮上调用

<button ontap="onPay">支付</button>

效果

clipboard.png

支付成功回调

关于回调处理请期待下一篇文章。~
回调处理请见下文:Laravel教程: 3分钟实现小程序微信支付接入(下)——回调发货逻辑

已知异常

如果你不添加.env,可能会报容器找不到这个应用的报错。


千里码博客
A.R.G.U.S.网络安全小组

便宜的SSL证书 www.ssl.com.ru

1.6k 声望
154 粉丝
0 条评论
推荐阅读
个人如何免费接入微信支付, 不用交300块钱
也不是没有办法, 微信现在推出了"服务商"模式, 也就是给线下小微商户开通微信收款的权限. 而微信为了方便服务商拓展业务, 给了服务商替商户发起支付的 API 接口, 支付完成再通知到服务商. 然后第二天, 到账的钱会...

ARGUS3阅读 8k

初学后端,如何做好表结构设计?
这篇文章介绍了设计数据库表结构应该考虑的4个方面,还有优雅设计的6个原则,举了一个例子分享了我的设计思路,为了提高性能我们也要从多方面考虑缓存问题。

王中阳Go4阅读 1.7k评论 2

封面图
Taro 小程序持续集成
传统意义上的持续集成,是在 Web 端通过自动化的方式将项目打包并上传到服务器,这一过程需要 Git 参与。持续集成的目的是为了免去手动打包、手动上传这一繁琐且容易出错的步骤,提高部署效率和部署的安全性。

杨成功4阅读 1.9k

封面图
一分钟搞明白!快速掌握 Go WebAssembly
最近因为各种奇怪的原因,更多的接触到了 WebAssembly。虽然之前很多博客也翻过写过各种文章,但总感觉欠些味道。于是今天梳理了一版,和大家一起展开学习。

煎鱼4阅读 2.2k

Laravel入门及实践,快速上手ThinkSNS+二次开发
【摘要】自从ThinkSNS+不使用ThinkPHP框架而使用Laravel框架之后,很多人都说技术门槛抬高了,其实你与TS+的距离仅仅只是学习一个新框架而已,所以,我们今天来说说Laravel的入门。

ThinkSNS1阅读 2.4k

使用taro+canvas实现微信小程序的图片分享功能 | 京东云技术团队
二轮充电业务中,用户充电完成后在订单详情页展示订单相关信息,用户点击分享按钮唤起微信小程序分享菜单,将生成的图片海报分享给微信好友或者下载到本地,好友可通过扫描海报中的二维码加群领取优惠。

京东云开发者2阅读 505

封面图
小程序内参数和扫码参数统一
写小程序的时候都会遇到扫码参数和小程序内跳转参数要分开处理的问题,但实际上参数和处理的方式都是一样的,这里封装一种方法,将扫码参数直接放到options下面,这样就不需要分开独立处理,减少冗余代码增加代码...

海洋饼干1阅读 869

便宜的SSL证书 www.ssl.com.ru

1.6k 声望
154 粉丝
宣传栏