Laravel 整合 EasyAlipay 實現支付寶手機網站 Wap 支付

zhaochong發表於2020-03-03

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 協議》,轉載必須註明作者和本文連結

相關文章