Laravel 整合 EasyAlipay 實現支付寶手機網站 Wap 支付!
安裝 EasyAlipay
這裡我們使用的 EasyAlipay 是:
https://github.com/shulidata/easyalipay
在 Laravel 專案根目錄下,使用安裝命令:
composer require shulidata/easyalipay
EasyAliapy 被安裝在 vendor/shulidata/easyalipay 目錄下面。目錄結構為:
- ./docs
- ./src
- ./test
- composer.json
- LICENSE.md
- NOTICE.md
- README.md
支付寶設定
首先在:
https://www.alipay.com/
註冊商家賬號。
然後,到:
https://b.alipay.com/signing/productDetail...
進行手機網站支付簽約,預計一個工作日內稽核通過。
在:
https://openhome.alipay.com/
入駐成為開發平臺開發者。
簽約稽核通過後,在:
https://openhome.alipay.com/platform/devel...
網頁&移動應用中,有一個已上線的 “應用2.0簽約2020****”
點進此應用,選擇“應用資訊”,進行“介面加簽方式的配置”。
點選“設定”後,在出現的頁面中選擇“公鑰”,並下載“支付寶金鑰生成器”。
使用“支付寶金鑰生成器”生成公鑰和私鑰:
EasyAlipay 用法
先對應幾種用法,初始化物件:
use EasyAlipay\Factory;
$options = [
'app_id' => '你的應用APPID',
'gateway_url' => "閘道器地址",//沙箱環境閘道器gateway_url:https://openapi.alipaydev.com/gateway.do,線上閘道器gateway_url:https://openapi.alipay.com/gateway.do
'sign_type' => "RSA2",
'charset' => "UTF-8",
'alipay_public_key' => '支付寶公鑰',
'merchant_private_key' => '應用私鑰',
// ...
];
//通用基礎
$app = Factory::base($options);
//營銷
$app = Factory::marketing($options);
//小程式
$app = Factory::mini($options);
//生活號
$app = Factory::openPublic($options);
//支付
$app = Factory::payment($options);
vendor/shulidata/easyalipay/docs/Payment/Pay.md 中的支付使用示例:
use EasyAlipay\Factory;
$options = [
'app_id' => '2016051900098985',
'alipay_public_key' => '支付寶公鑰',
'merchant_private_key' => '應用私鑰',
// ...
];
$app = Factory::payment($options);
$app['pay']->pay($subject,$out_trade_no,$total_amount,$auth_code);
檢視原始碼 vendor/shulidata/easyalipay/src/Payment/Pay/Client.php :
$request->setApiMethodName("alipay.trade.pay");
發現呼叫的是 alipay.trade.pay (統一收單交易支付介面)。
可是我們要使用的手機網站支付介面是 alipay.trade.wap.pay (手機網站支付介面2.0)。
修改 EasyAlipay 原始碼
拷貝 vendor/shulidata/easyalipay/src/Payment 目錄到 vendor/shulidata/easyalipay/src/Wap,並將拷貝後的所有原始碼中的 Payment
名稱空間改為 Pay
。
例如,將 vendor/shulidata/easyalipay/src/Wap/Pay/Client.php 中的:
namespace EasyAlipay\Payment\Pay;
use EasyAlipay\Payment\Model\AlipayTradePayContentBuilder;
修改為:
namespace EasyAlipay\Wap\Pay;
use EasyAlipay\Wap\Model\AlipayTradePayContentBuilder;
檢視 支付寶介面文件,請求引數部分有幾個必選項:
引數 | 型別 | 是否必填 | 最大長度 | 描述 | 示例值 |
---|---|---|---|---|---|
subject | String | 必選 | 256 | 商品的標題/交易標題/訂單標題/訂單關鍵字等。 | 大樂透 |
out_trade_no | String | 必選 | 64 | 商戶網站唯一訂單號 | 70501111111S001111119 |
total_amount | Price | 必選 | 9 | 訂單總金額,單位為元,精確到小數點後兩位,取值範圍[0.01,100000000] | 9.00 |
quit_url | String | 必選 | 400 | 使用者付款中途退出返回商戶網站的地址 | http://www.taobao.com/product/113714.html |
product_code | String | 必選 | 64 | 銷售產品碼,商家和支付寶簽約的產品碼 | QUICK_WAP_WAY |
繼續修改 Wap/Pay/Client.php 為:
$payContentBuilder = new AlipayTradePayContentBuilder();
$payContentBuilder->setSubject($subject);
$payContentBuilder->setOutTradeNo($out_trade_no);
$payContentBuilder->setTotalAmount($total_amount);
$payContentBuilder->setQuitUrl("https://www.example.com/recharge");
$payContentBuilder->setProductCode("QUICK_WAP_WAY");
$request = new AopRequest ();
$request->setBizContent($payContentBuilder->getBizContent());
$request->setApiMethodName("alipay.trade.wap.pay");
$request->setReturnUrl("https://www.example.com/me");
return($this->pageExecute($request, NULL, NULL)) ;
在 src/Wap/Model/AlipayTradePayContentBuilder.php 中新增:
private $quit_url="http://www.example.com";
private $product_code = "QUICK_WAP_WAY";
public function setQuitUrl($quit_url)
{
$this->quit_url = $quit_url;
$this->bizContentarr['quit_url'] = $quit_url;
}
public function setProductCode($product_code)
{
$this->product_code = $product_code;
$this->bizContentarr['product_code'] = $product_code;
}
使用
接下來使用,在自己的專案內新增業務邏輯:
use EasyAlipay\Factory;
$options = [
'app_id' => '你的app_id',
'alipay_public_key' => '支付寶公鑰',
'merchant_private_key' => '應用私鑰',
// ...
];
$app = Factory::wap($options);
$subject = "test";
$out_trade_no = time().rand(1000,9999);
$total_amount = 1;
$auth_code = "";
$ret = $app['pay']->pay($subject,$out_trade_no,$total_amount,$auth_code);
這樣就可以喚起支付寶進行手機網站 Wap 支付啦。
本作品採用《CC 協議》,轉載必須註明作者和本文連結