前後端分離微信支付
為了解決相關問題看了許多部落格文章這裡是記錄解決問題和方法,文章有不對的地方給予建議哦
安裝和配置就不一一介紹了請參照文件,話不多直接上程式碼你懂得。
參考連結
<?php
namespace App\Http\Controllers;
use SimpleSoftwareIO\QrCode\BaconQrCodeGenerator;
use Yansongda\Pay\Exceptions\GatewayException;
use Yansongda\Pay\Log;
use Yansongda\Pay\Pay;
class PayController extends Controller
{
protected $order = [
'out_trade_no' => time(), // 只能是數字、大小寫字母_-|* 且在同一個商戶號下唯一 要求32字元
'body' => '訂單支付',
'total_fee' => '1', // 訂單總金額,單位為分,詳見支付金額
];
/**
* 掃碼支付
*
* @return mixed
*/
public function weixinScanPay()
{
// 對支付異常捕獲和支付日誌記錄
try {
$pay = Pay::wechat(config('pay.wechat'))->scan($order);
$res = (new BaconQrCodeGenerator)
->format('svg')
->size(200)->errorCorrection("L")
->generate($pay['code_url']);
return $res;
} catch (GatewayException $e) {
Log::info('二維碼出錯:' . $e->getMessage());
}
}
/**
* H5支付訂單下單處理
* @return string
*/
public function H5Pay()
{
// TODO:訂單處理
$order = $this->order;
try {
$wap = Pay::wechat(config('pay.wechat'))->wap($order);
// 回撥地址支付完成頁面 config('pay.wechat.pay_success')地址需要與前端約定
$mweb_url = $wap->getTargetUrl() . '&redirect_url=' . config('pay.wechat.pay_success');
$set_wap = Pay::wechat(config('pay.wechat'))->wap($order)->setTargetUrl($mweb_url);
return $set_wap->getContent();// html內容進行跳轉
} catch (GatewayException $e) {
Log::info(date("H:i:s") . " 訂單{order['out_trade_no']}");
if (strpos($e->getMessage(), 'OK該訂單已支付') === false) {
// 不是已支付訂單
// $e->getMessage();
} else {
// 訂單已支付訊息;
}
}
}
/**
* 獲取 wx js api pay 資訊
*
* @param Api $api
* @return mixed
*/
public function Pay()
{
// 業務處理
$order = $this->order
try {
return Pay::wechat(config('pay.wechat'))->mp($order);
} catch (GatewayException $e) {
Log::info(date("H:i:s") . " 訂單{order['out_trade_no']}");
if (strpos($e->getMessage(), 'OK該訂單已支付') === false) {
// 不是已支付訂單
} else {
// 訂單已支付
}
}
}
/**
* 支付回撥
* @return \Symfony\Component\HttpFoundation\Response
*/
public function notify()
{
try {
Log::info('微信支付回撥開始<================================支付中');
$pay = Pay::wechat(config('pay.wechat'));
$data = $pay->verify(); // 驗籤
Log::debug('支付回撥引數', $data->all());
$outTradeNo = $data->out_trade_no;
Log::info('訂單編號====' . $outTradeNo);
// 業務處理
} catch (GatewayException $e) {
Log::error('微信回撥錯誤', [$e->getMessage()]);
}
Log::info('微信支付回撥結束================================>支付已完成');、
}
}
}
laravel -pay 本地開發測試注意客戶端IP地址獲取
本作品採用《CC 協議》,轉載必須註明作者和本文連結