TP5 实现微信支付和支付宝支付
生活随笔
收集整理的這篇文章主要介紹了
TP5 实现微信支付和支付宝支付
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1、微信支付
1.1、安裝依賴(lài)包
- 我這里使用 EasyWeChat 實(shí)現(xiàn)微信支付,另外我附上之前我封裝的微信類(lèi)。
- 詳細(xì)操作里面寫(xiě)的比較清楚,請(qǐng)先看這個(gè):https://www.jianshu.com/p/d376d921bf16
1.2、準(zhǔn)備工作
(1)需要去微信開(kāi)放平臺(tái)注冊(cè)賬號(hào)
- appid(微信開(kāi)放平臺(tái)上的應(yīng)用id)
- mch_id(微信申請(qǐng)成功之后郵件中的商戶(hù)id)
- notify_url(支付成功后的回調(diào)地址)
- api_key(在微信商戶(hù)平臺(tái)上自己設(shè)定的api密鑰 32位)
- apiclient_cert.pem 和?apiclient_key.pem 證書(shū)
相關(guān)的申請(qǐng)流程可以參考網(wǎng)站: https://developers.weixin.qq.com/doc/oplatform/Mobile_App/WeChat_Pay/Vendor_Service_Center.html
(2)將對(duì)應(yīng)的配置寫(xiě)入配置文件中(配置文件可以參考我下面封裝的微信類(lèi))
(3)創(chuàng)建訂單表
- 關(guān)于訂單表,這里給你們參考下我的
1.3、調(diào)用微信支付
$app = (new WeChatService())->connect(2); $result = $app->order->unify(['body' => $subject,'out_trade_no' => $orderNumber,'total_fee' => $amount * 100, // **單位:分**'spbill_create_ip' => '', // 可選,如不傳該參數(shù),SDK 將會(huì)自動(dòng)獲取相應(yīng) IP 地址'notify_url' => Env::get('web.host') . '/api/vip/wechatNotify', // 支付結(jié)果通知網(wǎng)址,如果不設(shè)置則會(huì)使用配置里的默認(rèn)地址'trade_type' => 'JSAPI', // 請(qǐng)對(duì)應(yīng)換成你的支付方式對(duì)應(yīng)的值類(lèi)型'openid' => $user['openid'], //從用戶(hù)額外表中取到openId ]); $res = json_decode($result, 1)['return_msg']; if ($res == 'OK') $this->success(MSG_OK,$result); //支付成功 $this->error('支付失敗'); //支付失敗- 后端 只需要在調(diào)用微信支付地方調(diào)用這段方法即可。
- H5 支付,公眾號(hào)支付,掃碼支付,支付中簽約,全部都是用這個(gè)接口下單。
- 前端 微信支付參考文檔 https://pay.weixin.qq.com/wiki/doc/api/index.html。
- 我們要根據(jù)前端需要的參數(shù)進(jìn)行返回。
1.4、微信支付異步操作(微信支付同步不需要我們做處理)
/*** @ApiTitle (微信異步支付會(huì)員VIP)* @ApiRoute (/api/Vip/wechatNotify)* @ApiInternal*/ public function wechatNotify() {$app = (new WeChatService())->connect(1);$response = $app->handlePaidNotify(function ($message, $fail) {$type = input('type') ?? 1; //類(lèi)型:1、開(kāi)通/續(xù)費(fèi)VIP$outTradeNo = $message['out_trade_no']; //自定義訂單號(hào)//查詢(xún)是否存在訂單$res = (new UserAccountModel)->where('order_number', $outTradeNo)->find();// 如果訂單不存在 或者 訂單已經(jīng)支付過(guò)了if (!$res || $res->pay_time) return true;if ($message['return_code'] === 'SUCCESS') { // return_code 表示通信狀態(tài),不代表支付狀態(tài)$tradeNo = $message['transaction_id']; //微信支付訂單號(hào)$totalFee = $message['total_fee']; //充值總金額$timeEnd = $message['time_end']; //支付完成時(shí)間//如果金額不匹配直接退出if (($res->money) != $totalFee / 100) return true;if ($message['result_code'] === 'SUCCESS') {//支付成功//更新資金表狀態(tài)(new UserAccountModel)->where('order_number', $outTradeNo)->update(['trade_no' => $tradeNo, //支付時(shí)間'pay_time' => $timeEnd, //支付時(shí)間'pay_status' => 1, //支付狀態(tài):0=未到賬,1=已到賬]);//開(kāi)通/升級(jí)VIPif ($type == 1) $this->vipSuccess($res['from_id'], $outTradeNo);}} else {return $fail('通信失敗,請(qǐng)稍后再通知我');}return true;});$response->send(); // Laravel 里請(qǐng)使用:return $response; }- 根據(jù)訂單號(hào),我們需要判斷訂單相關(guān)內(nèi)容。
- 返回碼也成功的狀態(tài)下,我們?cè)偃ミM(jìn)行判斷,成功則進(jìn)行相關(guān)的業(yè)務(wù)操作。
- 其中 vipSuccess 是我封裝的支付成功的操作方法。
- 另外根據(jù) type 進(jìn)行不同的操作,這個(gè)微信異步方法就可以通用了。
1.5、開(kāi)放獲取支付狀態(tài)的接口
public function getPayStatus() {$orderNumber = input('order_number'); //內(nèi)部訂單流水號(hào)$order = (new UserAccountModel)->where('order_number', $orderNumber)->find();if (!$order) $this->error('訂單不存在!');$status = $order['pay_status']; //支付狀態(tài):0=待支付,1=支付成功if (!$status) $this->error('訂單尚未支付成功!');$this->success('訂單支付成功!'); }- 該接口需要給前端用于判斷支付狀態(tài)。
2、支付寶支付
2.1、安裝依賴(lài)包
-
我這里使用的是 yansongda/pay
-
composer 安裝命令
- 支持
method 描述
web 電腦支付
wap 手機(jī)網(wǎng)站支付
app APP 支付
pos 刷卡支付
scan 掃碼支付
transfer 帳戶(hù)轉(zhuǎn)賬
mini 小程序支付
2.2、準(zhǔn)備工作
(1)申請(qǐng)支付開(kāi)放平臺(tái)并填寫(xiě)資料 https://open.alipay.com/platform/home.htm
(2)填寫(xiě)配置文件,如下
2.3、調(diào)用支付寶支付
//訂單內(nèi)容 $order = ['out_trade_no' => $orderNumber,'total_amount' => $amount,'subject' => $subject, ]; $alipay = Pay::alipay(config('alipay'))->web($order); //網(wǎng)頁(yè)支付 //$alipay = Pay::alipay(config('alipay'))->app($order); //app支付return $alipay->send();// laravel 框架中請(qǐng)直接 `return $alipay`- 其中封裝了方法,我們只要根據(jù)不同端調(diào)用不同的方法即可。
2.4、支付寶同步
/*** @ApiTitle (支付寶同步接口)* @ApiRoute (/api/Payment/alipayReturn)* @ApiInternal*/ public function alipayReturn() {$data = Pay::alipay(config('alipay'))->verify(); // 是的,驗(yàn)簽就這么簡(jiǎn)單!// 訂單號(hào):$data->out_trade_no// 支付寶交易號(hào):$data->trade_no// 訂單總金額:$data->total_amount// 訂單號(hào):$data->out_trade_no// 支付寶交易號(hào):$data->trade_no// 訂單總金額:$data->total_amountDb::startTrans();try {//驗(yàn)證數(shù)據(jù)$outTradeNo = $data->out_trade_no;$totalAmount = $data->total_amount;$tradeNo = $data->trade_no;$appId = $data->app_id;$res = (new UserAccountModel)->where('order_number', $outTradeNo)->find();if (!$res) $this->error('未找到該充值訂單!');if ($res['money'] != $totalAmount) $this->error('充值訂單金額異常!');if ($appId != config('alipay.app_id')) $this->error('充值支付平臺(tái)異常!');Db::commit();} catch (\Exception $e) {Db::rollback();$this->error($e->getMessage());}$data = ['order_number' => $outTradeNo, //訂單流水號(hào)'trade_no' => $tradeNo, //支付寶/微信訂單號(hào)'total_amount' => $totalAmount, //資金金額];$this->success('操作成功,等待充值結(jié)果!', $data); }- 同步接口是統(tǒng)一的,通用的。
2.5、支付寶異步操作
/*** @ApiTitle (支付寶異步接口)* @ApiRoute (/api/Payment/vipAliNotify)* @return \Symfony\Component\HttpFoundation\Response* @ApiAuthor (黃育華 2020/3/9)* @ApiInternal*/ public function alipayNotify() {$alipay = Pay::alipay(config('alipay'));$type = input('type') ?? 1; //類(lèi)型:1、開(kāi)通/續(xù)費(fèi)VIPDb::startTrans();try {$data = $alipay->verify(); // 是的,驗(yàn)簽就這么簡(jiǎn)單!$state = $data->trade_status; //訂單狀態(tài)$outTradeNo = $data->out_trade_no; //自定義訂單號(hào)$tradeNo = $data->trade_no; //支付寶訂單號(hào)$totalAmount = $data->total_amount; //充值總金額$appId = $data->app_id; //收款方的APPID//獲取對(duì)應(yīng)訂單的資金流水信息$res = (new UserAccountModel)->where('order_number', $outTradeNo)->find();// 請(qǐng)自行對(duì) trade_status 進(jìn)行判斷及其它邏輯進(jìn)行判斷,在支付寶的業(yè)務(wù)通知中,只有交易通知狀態(tài)為 TRADE_SUCCESS 或 TRADE_FINISHED 時(shí),支付寶才會(huì)認(rèn)定為買(mǎi)家付款成功。// 1、商戶(hù)需要驗(yàn)證該通知數(shù)據(jù)中的out_trade_no是否為商戶(hù)系統(tǒng)中創(chuàng)建的訂單號(hào);// 2、判斷total_amount是否確實(shí)為該訂單的實(shí)際金額(即商戶(hù)訂單創(chuàng)建時(shí)的金額);// 3、校驗(yàn)通知中的seller_id(或者seller_email) 是否為out_trade_no這筆單據(jù)的對(duì)應(yīng)的操作方(有的時(shí)候,一個(gè)商戶(hù)可能有多個(gè)seller_id/seller_email);// 4、驗(yàn)證app_id是否為該商戶(hù)本身。// 5、其它業(yè)務(wù)邏輯情況。if (!in_array($state, ['TRADE_SUCCESS', 'TRADE_FINISHED'])) return $alipay->success()->send();if (!$res) return $alipay->success()->send();if ($res['money'] != $totalAmount) return $alipay->success()->send();if ($appId != config('alipay.app_id')) return $alipay->success()->send();//以下執(zhí)行操作......//更新資金表狀態(tài)(new UserAccountModel)->where('order_number', $outTradeNo)->update(['trade_no' => $tradeNo, //支付時(shí)間'pay_time' => time(), //支付時(shí)間'pay_status' => 1, //支付狀態(tài):0=未到賬,1=已到賬]);//開(kāi)通/升級(jí)VIPif ($type == 1) $this->vipSuccess($res['from_id'], $outTradeNo);Log::debug('Alipay notify', $data->all());Db::commit();} catch (\Exception $e) {Db::rollback();}return $alipay->success()->send();// laravel 框架中請(qǐng)直接 `return $alipay->success()` }歡迎來(lái)指導(dǎo)和學(xué)習(xí),如果有什么問(wèn)題可以在留言區(qū)留言并一起探討。
總結(jié)
以上是生活随笔為你收集整理的TP5 实现微信支付和支付宝支付的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PHP操作文件常用函数
- 下一篇: Web端a标签跳转地图等链接(收藏)