由於項目需要,所以需要開發支付寶支付與微信支付,支付部分采用了
yansongda/pay https://packagist.org/packages/yansongda/pay https://yansongda.gitbooks.io/pay/(文檔說明地址)
第三方擴展包 , 簡單配置一下就可以使用,沒有遇到什么問題
但是由於業務需要, 需要用到提現業務,也就是支付寶支付的
alipay.fund.trans.toaccount.transfer(單筆轉賬到支付寶賬戶接口)
找了很久也沒有找到很簡單的集成支付寶單筆轉賬接口的擴展包,所以沒辦法只能自己來用支付寶給的SDK進行開發
首先下載了支付寶服務端SDK PHP版 下載地址https://docs.open.alipay.com/54/103419/
然后解壓添加進項目目錄 app\Libs\Alipay Libs為自己建的目錄,用來裝第三方類庫
之后打開composer.json文件 在autoload里面的classmap里面添加入新添加的SDK
"autoload": { "classmap": [ "database/seeds", "database/factories", "app/Libs/Alipay-php-sdk" ], "psr-4": { "App\\": "app/" }, 。。。。。。
之后再執行composer dump-autoload 這樣第三方的SDK就引入成功了
然后在控制器或者自己定義的業務層中就可以直接use這個SDK了 在new 類的時候會在前面出現 \ 屬於正常
然后將給出的PHP示例粘貼進自己的業務代碼中 點擊查看官方請求示例https://docs.open.alipay.com/api_28/alipay.fund.trans.toaccount.transfer#s4
注意事項:
1、粘貼到自己的業務邏輯中之后 所有new的類必須刪除自己手打引入 比如: AopClient() 、 AlipayFundTransToaccountTransferRequest() 否則會爆出class not found 等錯誤
2、按照說明配置所有參數之后,請求會爆出 “ 文件編碼:[UTF-8] 與表單提交編碼:[GBK]兩者不一致!”錯誤,只要將復制的代碼中 $aop->postCharset 值的GBK修改成為UTF-8即可
3、支付寶SDK與Laravel都自定義了encrypt與decrypt函數,所以會產生沖突,只要將支付寶SDK中的 \aop\AopClient.php \aop\AopEncrypt.php \lotusphp_runtime\Cookie\Cokkie.php 下的這兩個函數全部重新命名即可,注意所有的 包括引用函數 直接在編輯器中查找替換也可以。
然后根據自己的業務來進行修改就可以了
如果爆出 “$sign”錯誤,請檢查自己的公鑰、私鑰、AppID等是否正確,如果使用沙箱測試,請將網關修改為
$aop->gatewayUrl = 'https://openapi.alipaydev.com/gateway.do';
最后貼上自己的代碼,歡迎指教
/* *支付寶提現接口 */ public function toTransfer($orderNo, $account, $amount, $payName, $payeeRealName, $remark) { $aop = new \AopClient(); $aop->gatewayUrl = 'https://openapi.alipaydev.com/gateway.do'; $aop->appId = config('Alipay.AppId'); $aop->rsaPrivateKey = config('Alipay.PriKey'); $aop->alipayrsaPublicKey = config('Alipay.PubKey'); $aop->apiVersion = '1.0'; $aop->signType = 'RSA2'; $aop->postCharset = 'UTF-8'; $aop->format = 'json'; $request = new \AlipayFundTransToaccountTransferRequest (); $request->setBizContent("{" . "\"out_biz_no\":\"$orderNo\"," . "\"payee_type\":\"ALIPAY_LOGONID\"," . "\"payee_account\":\"$account\"," . "\"amount\":\"$amount\"," . "\"payer_show_name\":\"$payName\"," . "\"payee_real_name\":\"$payeeRealName\"," . "\"remark\":\"$remark\"" . "}"); $result = $aop->execute($request); $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response"; $resultCode = $result->$responseNode->code; if (!empty($resultCode) && $resultCode == 10000) { echo "成功"; } else { echo "失敗"; } }