This commit is contained in:
Ashang
2022-04-04 16:01:36 +08:00
commit 20c576b9bc
72 changed files with 4680 additions and 0 deletions
+12
View File
@@ -0,0 +1,12 @@
## 使用方法
### 注意此插件仅适用于独角数卡2.0.4版本以下,2.0.4版本或以上的独角数卡已经内置此插件,无需配置
1.将`app``routes`目录覆盖到网站根目录。
2.在独角数卡后台添加一个支付方式。
| 支付选项 | 商户id | 商户key | 商户密钥 | 备注 |
| :-----| :----- | :----- | :----- |:-----|
| Epusdt | api接口认证token | 空 | epusdt收银台地址+/api/v1/order/create-transaction| 如果独角数卡和epusdt在同一服务器则填写`127.0.0.1`不要填域名,例如`http://127.0.0.1:8000/api/v1/order/create-transaction` |
示例:
![示例配置](../../wiki/img/dujiaoka_epusdt.png)
@@ -0,0 +1,101 @@
<?php
/**
* The file was created by Assimon.
*
* @author assimon<ashang@utf8.hk>
* @copyright assimon<ashang@utf8.hk>
* @link http://utf8.hk/
*/
namespace App\Http\Controllers\Pay;
use App\Exceptions\RuleValidationException;
use App\Http\Controllers\PayController;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Http\Request;
class EpusdtController extends PayController
{
public function gateway(string $payway, string $orderSN)
{
try {
// 加载网关
$this->loadGateWay($orderSN, $payway);
//构造要请求的参数数组,无需改动
$parameter = [
"amount" => (float)$this->order->actual_price,//原价
"order_id" => $this->order->order_sn, //可以是用户ID,站内商户订单号,用户名
'redirect_url' => route('epusdt-return', ['order_id' => $this->order->order_sn]),
'notify_url' => url($this->payGateway->pay_handleroute . '/notify_url'),
];
$parameter['signature'] = $this->epusdtSign($parameter, $this->payGateway->merchant_id);
$client = new Client([
'headers' => [ 'Content-Type' => 'application/json' ]
]);
$response = $client->post($this->payGateway->merchant_pem, ['body' => json_encode($parameter)]);
$body = json_decode($response->getBody()->getContents(), true);
if (!isset($body['status_code']) || $body['status_code'] != 200) {
return $this->err(__('dujiaoka.prompt.abnormal_payment_channel') . $body['message']);
}
return redirect()->away($body['data']['payment_url']);
} catch (RuleValidationException $exception) {
} catch (GuzzleException $exception) {
return $this->err($exception->getMessage());
}
}
private function epusdtSign(array $parameter, string $signKey)
{
ksort($parameter);
reset($parameter); //内部指针指向数组中的第一个元素
$sign = '';
$urls = '';
foreach ($parameter as $key => $val) {
if ($val == '') continue;
if ($key != 'signature') {
if ($sign != '') {
$sign .= "&";
$urls .= "&";
}
$sign .= "$key=$val"; //拼接为url参数形式
$urls .= "$key=" . urlencode($val); //拼接为url参数形式
}
}
$sign = md5($sign . $signKey);//密码追加进入开始MD5签名
return $sign;
}
public function notifyUrl(Request $request)
{
$data = $request->all();
$order = $this->orderService->detailOrderSN($data['order_id']);
if (!$order) {
return 'fail';
}
$payGateway = $this->payService->detail($order->pay_id);
if (!$payGateway) {
return 'fail';
}
$signature = $this->epusdtSign($data, $payGateway->merchant_id);
if ($data['signature'] != $signature) { //不合法的数据
return 'fail'; //返回失败 继续补单
} else {
//合法的数据
//业务处理
$this->orderProcessService->completedOrder($data['order_id'], $data['amount'], $data['trade_id']);
return 'ok';
}
}
public function returnUrl(Request $request)
{
$oid = $request->get('order_id');
// 异步通知还没到就跳转了,所以这里休眠2秒
sleep(2);
return redirect(url('detail-order-sn', ['orderSN' => $oid]));
}
}
+56
View File
@@ -0,0 +1,56 @@
<?php
/**
* The file was created by Assimon.
*
* @author assimon<ashang@utf8.hk>
* @copyright assimon<ashang@utf8.hk>
* @link http://utf8.hk/
*/
use Illuminate\Support\Facades\Route;
Route::get('pay-gateway/{handle}/{payway}/{orderSN}', 'PayController@redirectGateway');
// 支付相关
Route::group(['prefix' => 'pay', 'namespace' => 'Pay', 'middleware' => ['dujiaoka.pay_gate_way']], function () {
// 支付宝
Route::get('alipay/{payway}/{orderSN}', 'AlipayController@gateway');
Route::post('alipay/notify_url', 'AlipayController@notifyUrl');
// 微信
Route::get('wepay/{payway}/{orderSN}', 'WepayController@gateway');
Route::post('wepay/notify_url', 'WepayController@notifyUrl');
// 码支付
Route::get('mapay/{payway}/{orderSN}', 'MapayController@gateway');
Route::post('mapay/notify_url', 'MapayController@notifyUrl');
// Paysapi
Route::get('paysapi/{payway}/{orderSN}', 'PaysapiController@gateway');
Route::post('paysapi/notify_url', 'PaysapiController@notifyUrl');
Route::get('paysapi/return_url', 'PaysapiController@returnUrl')->name('paysapi-return');
// payjs
Route::get('payjs/{payway}/{orderSN}', 'PayjsController@gateway');
Route::post('payjs/notify_url', 'PayjsController@notifyUrl');
// 易支付
Route::get('yipay/{payway}/{orderSN}', 'YipayController@gateway');
Route::get('yipay/notify_url', 'YipayController@notifyUrl');
Route::get('yipay/return_url', 'YipayController@returnUrl')->name('yipay-return');
// paypal
Route::get('paypal/{payway}/{orderSN}', 'PaypalPayController@gateway');
Route::get('paypal/return_url', 'PaypalPayController@returnUrl')->name('paypal-return');
Route::any('paypal/notify_url', 'PaypalPayController@notifyUrl');
// V免签
Route::get('vpay/{payway}/{orderSN}', 'VpayController@gateway');
Route::get('vpay/notify_url', 'VpayController@notifyUrl');
Route::get('vpay/return_url', 'VpayController@returnUrl')->name('vpay-return');
// stripe
Route::get('stripe/{payway}/{oid}','StripeController@gateway');
Route::get('stripe/return_url','StripeController@returnUrl');
Route::get('stripe/check','StripeController@check');
Route::get('stripe/charge','StripeController@charge');
// Coinbase
Route::get('coinbase/{payway}/{orderSN}', 'CoinbaseController@gateway');
Route::post('coinbase/notify_url', 'CoinbaseController@notifyUrl');
// epusdt
Route::get('epusdt/{payway}/{orderSN}', 'EpusdtController@gateway');
Route::post('epusdt/notify_url', 'EpusdtController@notifyUrl');
Route::get('epusdt/return_url', 'EpusdtController@returnUrl')->name('epusdt-return');
});