在easyswoole中,已經開發好了相關的支付組件,只需要引入即可:
composer require easyswoole/pay
pay組件支持協程
支付寶
支付方法
支付寶支付目前支持 7 種支付方法,對應的支付 method 如下:
電腦支付
統一收單下單並支付頁面接口
$aliConfig = new \EasySwoole\Pay\AliPay\Config(); $aliConfig->setGateWay(\EasySwoole\Pay\AliPay\GateWay::NORMAL); $aliConfig->setAppId('2017082000295641'); $aliConfig->setPublicKey('阿里公鑰'); $aliConfig->setPrivateKey('阿里私鑰'); $pay = new \EasySwoole\Pay\Pay(); ## 對象風格 $order = new \EasySwoole\Pay\AliPay\RequestBean\Web(); $order->setSubject('測試'); $order->setOutTradeNo(time().'123456'); $order->setTotalAmount('0.01'); // 本庫只預置了常用的請求參數,沒預置的參數使用:$order->addProperty('其他字段','其他字段值'); ## 數組風格 $order = new \EasySwoole\Pay\AliPay\RequestBean\App([ 'subject'=>'測試', 'out_trade_no'=>'123456', 'total_amount'=>'0.01', '額外的字段鍵值'=>'額外字段值' ],true); $res = $pay->aliPay($aliConfig)->web($order); var_dump($res->toArray()); $html = buildPayHtml(\EasySwoole\Pay\AliPay\GateWay::NORMAL,$res->toArray()); file_put_contents('test.html',$html);
訂單配置參數
所有訂單配置中,客觀參數均不用配置,擴展包已經為大家自動處理了,比如,product_code
等參數。
所有訂單配置參數和官方無任何差別,兼容所有功能,所有參數請參考這里,查看「請求參數」一欄。
參數查詢:https://docs.open.alipay.com/api_1/alipay.trade.page.pay
生成支付的跳轉html示例
function buildPayHtml($endpoint, $payload) { $sHtml = "<form id='alipaysubmit' name='alipaysubmit' action='".$endpoint."' method='POST'>"; foreach ($payload as $key => $val) { $val = str_replace("'", ''', $val); $sHtml .= "<input type='hidden' name='".$key."' value='".$val."'/>"; } $sHtml .= "<input type='submit' value='ok' style='display:none;'></form>"; $sHtml .= "<script>document.forms['alipaysubmit'].submit();</script>"; return $sHtml; }
手機網站支付接口2.0
$aliConfig = new \EasySwoole\Pay\AliPay\Config(); $aliConfig->setGateWay(\EasySwoole\Pay\AliPay\GateWay::NORMAL); $aliConfig->setAppId('2017082000295641'); $aliConfig->setPublicKey('阿里公鑰'); $aliConfig->setPrivateKey('阿里私鑰'); $pay = new \EasySwoole\Pay\Pay(); $order = new \EasySwoole\Pay\AliPay\RequestBean\Wap(); $order->setSubject('測試'); $order->setOutTradeNo(time().'123456'); $order->setTotalAmount('0.01'); $res = $pay->aliPay($aliConfig)->wap($order); var_dump($res->toArray()); $html = buildPayHtml(\EasySwoole\Pay\AliPay\GateWay::NORMAL,$res->toArray()); file_put_contents('test.html',$html);
訂單配置參數
所有訂單配置中,客觀參數均不用配置,擴展包已經為大家自動處理了,比如,product_code
等參數。
所有訂單配置參數和官方無任何差別,兼容所有功能,所有參數請參考這里,查看「請求參數」一欄。
參數查詢:https://docs.open.alipay.com/api_1/alipay.trade.wap.pay
APP支付接口2.0
$aliConfig = new \EasySwoole\Pay\AliPay\Config(); $aliConfig->setGateWay(\EasySwoole\Pay\AliPay\GateWay::SANDBOX); $aliConfig->setAppId('2016091800538339'); $aliConfig->setPublicKey('阿里公鑰'); $aliConfig->setPrivateKey('阿里私鑰'); $pay = new \EasySwoole\Pay\Pay(); $order = new \EasySwoole\Pay\AliPay\RequestBean\App(); $order->setSubject('測試'); $order->setOutTradeNo(time().'123456'); $order->setTotalAmount('0.01'); $aliPay = $pay->aliPay($aliConfig); var_dump($aliPay->app($order)->toArray());
訂單配置參數
所有訂單配置中,客觀參數均不用配置,擴展包已經為大家自動處理了,比如, product_code
等參數。
所有訂單配置參數和官方無任何差別,兼容所有功能,所有參數請參考這里,查看「請求參數」一欄。
參數查詢:https://docs.open.alipay.com/api_1/alipay.trade.app.pay
刷卡支付
$aliConfig = new \EasySwoole\Pay\AliPay\Config(); $aliConfig->setGateWay(\EasySwoole\Pay\AliPay\GateWay::SANDBOX); $aliConfig->setAppId('2016091800538339'); $aliConfig->setPublicKey('阿里公鑰'); $aliConfig->setPrivateKey('阿里私鑰'); $pay = new \EasySwoole\Pay\Pay(); $order = new \EasySwoole\Pay\AliPay\RequestBean\Pos(); $order->setSubject('測試'); $order->setTotalAmount('0.01'); $order->setOutTradeNo(time()); $order->setAuthCode('289756915257123456'); $aliPay = $pay->aliPay($aliConfig); $data = $aliPay->pos($order)->toArray(); var_dump($data);
訂單配置參數
所有訂單配置中,客觀參數均不用配置,擴展包已經為大家自動處理了,比如,product_code
等參數。
所有訂單配置參數和官方無任何差別,兼容所有功能,所有參數請參考這里,查看「請求參數」一欄。
參數查詢:https://docs.open.alipay.com/api_1/alipay.trade.page.pay
掃碼支付
$aliConfig = new \EasySwoole\Pay\AliPay\Config(); $aliConfig->setGateWay(\EasySwoole\Pay\AliPay\GateWay::SANDBOX); $aliConfig->setAppId('2016091800538339'); $aliConfig->setPublicKey('阿里公鑰'); $aliConfig->setPrivateKey('阿里私鑰'); $pay = new \EasySwoole\Pay\Pay(); $pay = new \EasySwoole\Pay\Pay(); $order = new \EasySwoole\Pay\AliPay\RequestBean\Scan(); $order->setSubject('測試'); $order->setTotalAmount('0.01'); $order->setOutTradeNo(time()); $aliPay = $pay->aliPay($aliConfig); $data = $aliPay->scan($order)->toArray(); $response = $aliPay->preQuest($data); var_dump($response); // qr_code 當前預下單請求生成的二維碼碼串,可以用二維碼生成工具根據該碼串值生成對應的二維碼 https://qr.alipay.com/bavh4wjlxf12tper3a
訂單配置參數
所有訂單配置中,客觀參數均不用配置,擴展包已經為大家自動處理了,比如,product_code
等參數。
所有訂單配置參數和官方無任何差別,兼容所有功能,所有參數請參考這里,查看「請求參數」一欄。
參考參數:https://docs.open.alipay.com/api_1/alipay.trade.precreate
單筆轉賬到支付寶賬戶接口
$aliConfig = new \EasySwoole\Pay\AliPay\Config(); $aliConfig->setGateWay(\EasySwoole\Pay\AliPay\GateWay::SANDBOX); $aliConfig->setAppId('2016091800538339'); $aliConfig->setPublicKey('阿里公鑰'); $aliConfig->setPrivateKey('阿里私鑰'); $pay = new \EasySwoole\Pay\Pay(); $order = new \EasySwoole\Pay\AliPay\RequestBean\Transfer(); $order->setSubject('測試'); $order->setTotalAmount('0.01'); $order->setPayeeType('ALIPAY_LOGONID'); $order->setPayeeAccount('hcihsn8174@sandbox.com'); $aliPay = $pay->aliPay($aliConfig); $data = $aliPay->transfer($order)->toArray(); $aliPay->preQuest($data); var_dump($data);
訂單配置參數
所有訂單配置中,客觀參數均不用配置,擴展包已經為大家自動處理了,比如,product_code
等參數。
所有訂單配置參數和官方無任何差別,兼容所有功能,所有參數請參考這里,查看「請求參數」一欄。
參數查詢:https://docs.open.alipay.com/api_28/alipay.fund.trans.toaccount.transfer
小程序支付
$aliConfig = new \EasySwoole\Pay\AliPay\Config(); $aliConfig->setGateWay(\EasySwoole\Pay\AliPay\GateWay::SANDBOX); $aliConfig->setAppId('2016091800538339'); $aliConfig->setPublicKey('阿里公鑰'); $aliConfig->setPrivateKey('阿里私鑰'); $pay = new \EasySwoole\Pay\Pay(); $order = new \EasySwoole\Pay\AliPay\RequestBean\MiniProgram(); $order->setSubject('測試'); $order->setOutTradeNo(time().'123456'); $order->setTotalAmount('0.01'); $order->setBuyerId('hcihsn8174@sandbox.com'); $aliPay = $pay->aliPay($aliConfig); $data = $aliPay->miniProgram($order)->toArray(); var_dump($data);
訂單配置參數
所有訂單配置中,客觀參數均不用配置,擴展包已經為大家自動處理了,比如,product_code
等參數。
所有訂單配置參數和官方無任何差別,兼容所有功能,所有參數請參考這里,查看「請求參數」一欄。
小程序支付接入文檔:https://docs.alipay.com/mini/introduce/pay。
參數查詢:
訂單查詢
$aliConfig = new \EasySwoole\Pay\AliPay\Config(); $aliConfig->setGateWay(\EasySwoole\Pay\AliPay\GateWay::SANDBOX); $aliConfig->setAppId('2016091800538339'); $aliConfig->setPublicKey('阿里公鑰'); $aliConfig->setPrivateKey('阿里私鑰'); $pay = new \EasySwoole\Pay\Pay(); $order = new \EasySwoole\Pay\AliPay\RequestBean\OrderFind(); $order->setOutTradeNo(time().'123456'); $aliPay = $pay->aliPay($aliConfig); var_dump($aliPay->orderFind($order)->toArray());
官方參數查詢:https://docs.open.alipay.com/api_1/alipay.trade.fastpay.refund.query
退款查詢
$aliConfig = new \EasySwoole\Pay\AliPay\Config(); $aliConfig->setGateWay(\EasySwoole\Pay\AliPay\GateWay::SANDBOX); $aliConfig->setAppId('2016091800538339'); $aliConfig->setPublicKey('阿里公鑰'); $aliConfig->setPrivateKey('阿里私鑰'); $pay = new \EasySwoole\Pay\Pay(); $order = new \EasySwoole\Pay\AliPay\RequestBean\RefundFind(); $order->setOutTradeNo('20150320010101001'); $order->setOutRequestNo(time().'2014112611001004680073956707'); $aliPay = $pay->aliPay($aliConfig); $data = $aliPay->refundFind($order)->toArray(); var_dump($aliPay->preQuest($data));
官方參數查詢:https://docs.open.alipay.com/api_1/alipay.trade.refund
查詢轉賬訂單接口
$aliConfig = new \EasySwoole\Pay\AliPay\Config(); $aliConfig->setGateWay(\EasySwoole\Pay\AliPay\GateWay::SANDBOX); $aliConfig->setAppId('2016091800538339'); $aliConfig->setPublicKey('阿里公鑰'); $aliConfig->setPrivateKey('阿里私鑰'); $pay = new \EasySwoole\Pay\Pay(); $order = new \EasySwoole\Pay\AliPay\RequestBean\TransferFind(); $order->setOutBizNo('3142321423432'); // 二選一 // $order->setOrderId('20160627110070001502260006780837'); $aliPay = $pay->aliPay($aliConfig); $data = $aliPay->transferFind($order)->toArray(); var_dump($aliPay->preQuest($data));
官方參數查詢:https://docs.open.alipay.com/api_28/alipay.fund.trans.order.query
交易撤銷接口
$aliConfig = new \EasySwoole\Pay\AliPay\Config(); $aliConfig->setGateWay(\EasySwoole\Pay\AliPay\GateWay::SANDBOX); $aliConfig->setAppId('2016091800538339'); $aliConfig->setPublicKey('阿里公鑰'); $aliConfig->setPrivateKey('阿里私鑰'); $pay = new \EasySwoole\Pay\Pay(); $order = new \EasySwoole\Pay\AliPay\RequestBean\Cancel(); $order->setOutTradeNo('20150320010101001'); $aliPay = $pay->aliPay($aliConfig); $data = $aliPay->cancel($order)->toArray(); var_dump($aliPay->preQuest($data));
官方參數查詢:https://docs.open.alipay.com/api_1/alipay.trade.cancel
交易關閉接口
$aliConfig = new \EasySwoole\Pay\AliPay\Config(); $aliConfig->setGateWay(\EasySwoole\Pay\AliPay\GateWay::SANDBOX); $aliConfig->setAppId('2016091800538339'); $aliConfig->setPublicKey('阿里公鑰'); $aliConfig->setPrivateKey('阿里私鑰'); $pay = new \EasySwoole\Pay\Pay(); $order = new \EasySwoole\Pay\AliPay\RequestBean\Close(); $order->setOutTradeNo(time().'123456'); $aliPay = $pay->aliPay($aliConfig); $data = $aliPay->close($order)->toArray(); var_dump($aliPay->preQuest($data));
官方參數查詢:https://docs.open.alipay.com/api_1/alipay.trade.close
查詢對賬單下載地址
$aliConfig = new \EasySwoole\Pay\AliPay\Config(); $aliConfig->setGateWay(\EasySwoole\Pay\AliPay\GateWay::SANDBOX); $aliConfig->setAppId('2016091800538339'); $aliConfig->setPublicKey('阿里公鑰'); $aliConfig->setPrivateKey('阿里私鑰'); $pay = new \EasySwoole\Pay\Pay(); $order = new \EasySwoole\Pay\AliPay\RequestBean\Download(); $order->setBillType('trade'); $order->setBillDate('2016-04-05'); $aliPay = $pay->aliPay($aliConfig); $data = $aliPay->download($order)->toArray(); var_dump($aliPay->preQuest($data));
官方參數查詢:https://docs.open.alipay.com/api_15/alipay.data.dataservice.bill.downloadurl.query
驗證服務器數據
$aliConfig = new \EasySwoole\Pay\AliPay\Config(); $aliConfig->setGateWay(\EasySwoole\Pay\AliPay\GateWay::SANDBOX); $aliConfig->setAppId('2016091800538339'); $aliConfig->setPublicKey('阿里公鑰'); $aliConfig->setPrivateKey('阿里私鑰'); $pay = new \EasySwoole\Pay\Pay(); $param = [];//偽代碼,post數據 unset($param['sign_type']);//需要忽略sign_type組裝 $order = new \EasySwoole\Pay\AliPay\RequestBean\NotifyRequest($param,true); $aliPay = $pay->aliPay($aliConfig); $result = $aliPay->verify($order); var_dump($result);
服務器確認收到異步通知字符串獲取
\EasySwoole\Pay\AliPay::success();//成功響應 \EasySwoole\Pay\AliPay::fail();//失敗響應
微信支付
微信支付目前支持 3 種支付方法,對應的支付 method 如下:
微信參數配置
$wechatConfig = new Config(); $wechatConfig->setAppId('xxxxxx'); // 除了小程序以外使用該APPID $wechatConfig->setMiniAppId('xxxxxx'); // 小程序使用該APPID $wechatConfig->setMchId('xxxxxx'); $wechatConfig->setKey('xxxxxx'); $wechatConfig->setNotifyUrl('xxxxx'); $wechatConfig->setApiClientCert('xxxxxxx');//客戶端證書 $wechatConfig->setApiClientKey('xxxxxxx'); //客戶端證書秘鑰
由於小程序擁有獨立的APPID,只需要在配置里同時配置上AppId和MiniAppId兩個配置項,在支付的時候會自動選擇對應的APPID來發起支付
公眾號支付
$officialAccount = new OfficialAccount(); $officialAccount->setOpenid('xxxxxxx'); $officialAccount->setOutTradeNo('CN' . date('YmdHis') . rand(1000, 9999)); $officialAccount->setBody('xxxxx-測試' . $outTradeNo); $officialAccount->setTotalFee(1); $officialAccount->setSpbillCreateIp('xxxxx'); $pay = new \EasySwoole\Pay\Pay(); $params = $pay->weChat($wechatConfig)->officialAccount($officialAccount);
可以參考demo/wechat/index.php
H5支付
$wap = new \EasySwoole\Pay\WeChat\RequestBean\Wap(); $wap->setOutTradeNo('CN' . date('YmdHis') . rand(1000, 9999)); $wap->setBody('xxxxx-WAP測試' . $outTradeNo); $wap->setTotalFee(1); $wap->setSpbillCreateIp('xxxxx'); $pay = new \EasySwoole\Pay\Pay(); $params = $pay->weChat($wechatConfig)->wap($wap);
小程序支付
$bean = new \EasySwoole\Pay\WeChat\RequestBean\MiniProgram(); $bean->setOpenid('xxxxxxxxx'); $bean->setOutTradeNo('CN' . date('YmdHis') . rand(1000, 9999)); $bean->setBody('xxxx-測試' . $outTradeNo); $bean->setTotalFee(1); $bean->setSpbillCreateIp($this->request()->getHeader('x-real-ip')[0]); $pay = new \EasySwoole\Pay\Pay(); $params = $pay->weChat($this->wechatConfig)->miniProgram($bean);
掃碼支付
模式一
生成掃碼鏈接 然后生成二維碼 具體請查看demo/wechat/index.php
$biz = new Biz(); $biz->setProductId('123456789'); $biz->setTimeStamp(time()); $biz->setAppId($wechatConfig->getAppId()); $biz->setMchId($wechatConfig->getMchid()); $data = $biz->toArray(); $u = new Utility($wechatConfig); $sign = $u->generateSign($data); $biz->setSign($sign); $url1 = "weixin://wxpay/bizpayurl?" . $this->ToUrlParams($biz->toArray());
掃碼回調地址(ps:公眾號平台設置)
$xml = $this->request()->getBody()->__toString(); $pay = new Pay(); $data = $pay->weChat($this->wechatConfig)->verify($xml); $bean = new \EasySwoole\Pay\WeChat\RequestBean\Scan(); $bean->setOutTradeNo('CN' . date('YmdHis') . rand(1000, 9999)); $bean->setOpenid('xxxxxx'); $bean->setProductId($data['product_id']); $bean->setBody('xxxxxx-SCAN測試' . $outTradeNo); $bean->setTotalFee(1); $bean->setSpbillCreateIp($this->request()->getHeader('x-real-ip')[0]); $response = $pay->weChat($this->wechatConfig)->scan($bean); $nativeResponse = new NativeResponse([ 'appid' => $this->wechatConfig->getAppId(), 'mch_id' => $this->wechatConfig->getMchId(), 'prepay_id' => $response->getPrepayId(), 'nonce_str' => $response->getNonceStr()]); $u = new Utility($this->wechatConfig); $nativeResponse->setSign($u->generateSign($nativeResponse->toArray())); $xml = (new SplArray($nativeResponse->toArray()))->toXML(); $this->response()->write($xml);
模式二
$bean = new \EasySwoole\Pay\WeChat\RequestBean\Scan(); $bean->setOutTradeNo($outTradeNo); $bean->setProductId('123456789'); $bean->setBody('xxxx-SCAN2測試' . $outTradeNo); $bean->setTotalFee(1); $bean->setSpbillCreateIp($this->request()->getHeader('x-real-ip')[0]); $pay = new Pay(); $data = $pay->weChat($this->wechatConfig)->scan($bean); $url2 = $data->getCodeUrl();
訂單查詢
go(function () use ($wechatConfig) { $orderFind = new \EasySwoole\Pay\WeChat\RequestBean\OrderFind(); $orderFind->setOutTradeNo('CN201903181044383609'); $pay = new \EasySwoole\Pay\Pay(); $info = $pay->weChat($wechatConfig)->orderFind($orderFind); print_r((array)$info); });
申請退款
go(function () use ($wechatConfig) { $refund = new \EasySwoole\Pay\WeChat\RequestBean\Refund(); $refund->setOutTradeNo('CN201903181111275823'); $refund->setOutRefundNo('TK' . date('YmdHis') . rand(1000, 9999)); $refund->setTotalFee(1); $refund->setRefundFee(1); $refund->setNotifyUrl('xxxxx'); $pay = new \EasySwoole\Pay\Pay(); $info = $pay->weChat($wechatConfig)->refund($refund); print_r($info); });
退款查詢
go(function () use ($wechatConfig) { $refundFind = new \EasySwoole\Pay\WeChat\RequestBean\RefundFind(); $refundFind->setOutTradeNo('CN201903181044383609'); $pay = new \EasySwoole\Pay\Pay(); $info = $pay->weChat($wechatConfig)->refundFind($refundFind); print_r((array)$info); });
關閉訂單
go(function () use ($wechatConfig) { $close = new \EasySwoole\Pay\WeChat\RequestBean\Close(); $close->setOutTradeNo('CN201903151343107239'); $pay = new \EasySwoole\Pay\Pay(); $info = $pay->weChat($wechatConfig)->close($close); print_r((array)$info); });
下載對賬單
go(function () use ($wechatConfig) { $download = new \EasySwoole\Pay\WeChat\RequestBean\Download(); $download->setBillDate('20190312'); $download->setBillType('ALL');//這個參數必傳 $pay = new \EasySwoole\Pay\Pay(); $info = $pay->weChat($wechatConfig)->download($download); echo htmlspecialchars($info, ENT_QUOTES);});
下載資金對賬單
go(function () use ($wechatConfig) { $download = new \EasySwoole\Pay\WeChat\RequestBean\DownloadFundFlow(); $download->setBillDate('20190312'); $download->setAccountType('Basic'); $pay = new \EasySwoole\Pay\Pay(); $info = $pay->weChat($wechatConfig)->downloadFundFlow($download); echo htmlspecialchars($info, ENT_QUOTES); });
驗證簽名
$pay = new \EasySwoole\Pay\Pay(); $content = ''; //content為xml原始數據,在easyswoole中可通過$this->request()->getBody()->__toString()取出 $data = $pay->weChat($wechatConfig)->verify($content)
服務器確認收到異步通知字符串獲取
\EasySwoole\Pay\WeChat\WeChat::success();//成功響應 \EasySwoole\Pay\WeChat\WeChat::fail();//失敗響應
本文轉自 www.easyswoole.com 官方文檔