近来公司开发一个关于招聘的APP所需要对接到微信支付与支付宝支付,网上一番搜索,基本全是CPCP再CP的文章,无奈还得靠自己研究一番(其实不难),文章较长,有需要的请细看。 技术框架:Laravel6.x+uni-app 扩展包:yansongda/laravel-pay 2.0(github 与 文档)
对接一个开通VIP的支付 安装好Laravel6.x版本的,并安装yansongda/laravel-pay包
composer require yansongda/laravel-pay如出现说内存不足 可以尝试临时变更内存限制,Composer 问题
COMPOSER_MEMORY_LIMIT=-1 composer require yansongda/laravel-pay运行配置文件,生成config/pay.php
php artisan vendor:publish --provider="Yansongda\LaravelPay\PayServiceProvider" --tag=laravel-pay建议使用公钥证书模式(RSA2)配置,毕竟官方都大力推荐的,证书还是比普通的安全,像https与http,是吧 文档任意门 创建应用 生成秘钥 如个人对接,不涉及到转帐什么的,可直接用公钥模式(RSA),需要填写三个配置
# 应用APPID ALI_APP_ID= # 支付宝公钥, 非应用公钥(非支付宝开放开发助手生成) ALI_PUBLIC_KEY= # 私钥(支付宝开放开发助手生成) ALI_PRIVATE_KEY=如涉及到转帐,打款等资金流向的操作,则需要使用公钥证书模式(RSA2),需要填写配置 上面的例子,证书放在了/public/cert/ 下,需要注意文件夹与文件的权限,一般可给644
// config/pay.php ali_public_key=路径 app_cert_public_key=路径 alipay_root_cert=路径 // env那边则需要配置两个 # 应用APPID ALI_APP_ID= # 私钥(支付宝开放开发助手生成) ALI_PRIVATE_KEY=上面的区别就是 config/pay.php 里的 ali_public_key 如RSA的则是 env(‘ALI_PUBLIC_KEY’);如RSA2的则是支付宝公钥证书路径 最后附上支付宝接口加签方式的图片和前端配置的图片
需要在微信开放平台 创建应用,并开通好微信支付,获取
WECHAT_APP_IDWECHAT_APPIDWECHAT_MCH_IDWECHAT_KEY这里的调试有个比较坑的地方,目前我也不知道是什么问题,知道的大神麻烦解答下:github issues APP微信支付配置WECHAT_APPID与WECHAT_APP_ID导致支付与查询出现异常,所以上面的WECHAT_APP_ID与WECHAT_APPID我都一并填写一样的了,目前使用没发现异常。
先新建一个表(创建model的同时新建表)
php artisan make:model Models/VipOrder -m编写好数据库字段(基本字段就可以了)
Schema::create('vip_orders', function (Blueprint $table) { $table->bigIncrements('id'); $table->unsignedInteger('user_id')->default(0)->index()->comment('用户id'); $table->char('order_no', 22)->default('')->comment('订单号'); $table->tinyInteger('state')->default(0)->comment('订单状态 -1 已关闭 0 待付款 1 已付款'); $table->string('transid')->default('')->comment('交易单号'); $table->decimal('price')->default(0)->comment('价格'); $table->unsignedSmallInteger('numbers')->default(0)->comment('购买次数'); $table->unsignedTinyInteger('paytype')->default(0)->comment('支付方式 1 微信 2 支付宝'); $table->string('remark')->default('')->comment('订单备注'); $table->string('syremark')->default('')->comment('系统备注'); $table->timestamp('paid_at')->nullable()->comment('支付时间'); $table->softDeletes(); $table->timestamps(); }); DB::statement("alter table `vip_orders` comment 'vip订单'");route/api.php
// 支付宝支付 Route::any('alipay/notify', 'AlipayController@notify'); Route::get('alipay/return', 'AlipayController@return'); // 微信支付 Route::any('wechat/notify', 'WechatController@notify');用户选择需要开通的等级后,请求此接口 route/api.php
// 创建VIP订单 Route::post('vip/pay', 'VipOrdersController@pay');请求接口:
public function pay(Request $request) { $setting = Setting::select('vip_set') ->firstOrFail(); $vip_key = request('vip_key', 0); // 用户选择的开通次数等级 $paytype = request('paytype', 0); // 用户选择的支付方式 $uid = auth('api')->userOrFail()->id; // 查询2分钟内是否已下单 if (env('APP_ENV') == 'production') { $has_order = VipOrder::where(['user_id' => $uid])->whereDate('created_at', Carbon::now()->toDateString())->where('created_at', '>', Carbon::now()->subMinutes(2))->exists(); if ($has_order) { return Responses::json(Responses::CONTINUE, '请别频繁下单'); } } // 获取相应的vip设置 $vip = isset($setting->vip_set) ? $setting->vip_set['vips'] : []; if (!isset($vip[$vip_key]) || empty($vip[$vip_key])) { return Responses::json(Responses::CONTINUE, Responses::NOT_FOUND_DATA); } // 创建no-自定义创建 $no = Helpers::createNO('VO'); // 标题-自定义 $title = '开通VIP'; if ($paytype == 1) { /// ---微信支付--- $config = config('pay.wechat'); $openid = auth('api')->user()->openid; if (empty($openid)) { return Responses::json(Responses::CONTINUE, '请先授权绑定微信'); } $order = [ 'out_trade_no' => $no, 'total_fee' => $vip[$vip_key]['price'] * 100, // **单位:分** 'body' => $title, 'openid' => $openid, ]; $pay = Pay::wechat($config)->app($order)->getContent(); } else if ($paytype == 2) { /// ---支付宝支付--- $config = config('pay.alipay'); $order = [ 'out_trade_no' => $no, 'total_amount' => $vip[$vip_key]['price'], 'subject' => $title, 'body' => $title, 'timeout_express' => '15m' ]; $pay = Pay::alipay($config)->app($order)->getContent(); } else { return Responses::json(Responses::CONTINUE, '请选择支付方式'); } $m_order = new VipOrder(); $m_order->user_id = $uid; $m_order->order_no = $no; $m_order->state = 0; $m_order->price = $vip[$vip_key]['price']; $m_order->numbers = $vip[$vip_key]['count']; $m_order->paytype = $paytype; $m_order->save(); // return $pay; // 这里根据自定义的json格式返回给前端处理就好了 return Responses::json(Responses::OK, Responses::SUCCESS, $pay); }关于调试,有几点建议
config/pay.php 里的log 设置debug支付宝可配置沙箱模式,并下载相关工具调试,可直接在电脑安装个模拟器(如逍遥模拟器),工具传送门安装Laravel 日志查看扩展,composer后再简单配置一下路由 route/web.phpcomposer require rap2hpoutre/laravel-log-viewer Route::get('logs', '\Rap2hpoutre\LaravelLogViewer\LogViewerController@index');如有问题,欢迎留言–我改
