You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
5.4 KiB
169 lines
5.4 KiB
<?php
|
|
namespace app\common\payment;
|
|
|
|
use think\facade\Db;
|
|
use think\facade\Log;
|
|
|
|
use app\common\payment\BasePayment;
|
|
use app\common\payment\Ipayment;
|
|
|
|
use Ecpay\Sdk\Factories\Factory;
|
|
use Ecpay\Sdk\Services\UrlService;
|
|
|
|
//實作金流串接介面
|
|
class EcpayATM extends BasePayment implements Ipayment{
|
|
private $api_url;
|
|
private $MerchantId;
|
|
private $HashIv;
|
|
private $HashKey;
|
|
|
|
public function __construct()
|
|
{
|
|
$payment = Db::name('payment')
|
|
->where('pay_code', 'ecatm')
|
|
->find();
|
|
|
|
if ($payment['is_test'] == 0) {
|
|
$this->api_url = 'https://payment-stage.ecpay.com.tw';
|
|
$this->MerchantId = '2000132';
|
|
$this->HashIv = 'v77hoKGq4kWxNNIS';
|
|
$this->HashKey = '5294y06JbISpM5x9';
|
|
} else {
|
|
$config = json_decode($payment['pay_config'], true);
|
|
if (empty($config['MerchantId']) || empty($config['HashIv']) || empty($config['HashKey'])) {
|
|
throw new \Exception('請先設定綠界金流參數');
|
|
}
|
|
$this->api_url = 'https://payment.ecpay.com.tw';
|
|
$this->MerchantId = $config['MerchantId'];
|
|
$this->HashIv = $config['HashIv'];
|
|
$this->HashKey = $config['HashKey'];
|
|
}
|
|
}
|
|
|
|
public function pay( $order ){
|
|
$goods_list = '';
|
|
foreach($order['goods_list'] as $goods){
|
|
$goods_list .= $goods['goods_name']."#";
|
|
//如果$goods_list結尾是#,則去掉
|
|
if(substr($goods_list,-1) == '#'){
|
|
$goods_list = substr($goods_list,0,-1);
|
|
}
|
|
}
|
|
|
|
$factory = new Factory([
|
|
'hashKey' => $this->HashKey,
|
|
'hashIv' => $this->HashIv,
|
|
]);
|
|
|
|
$autoSubmitFormService = $factory->create('ReturnSubmitFormWithCmvService');
|
|
|
|
$input = [
|
|
'MerchantID' => $this->MerchantId,
|
|
'MerchantTradeNo' => $order['order_sn'],
|
|
'MerchantTradeDate' => date('Y/m/d H:i:s'),
|
|
'PaymentType' => 'aio',
|
|
'TotalAmount' => $order['order_amount'],
|
|
'TradeDesc' => UrlService::ecpayUrlEncode('Slash Shop'),
|
|
'ItemName' => $goods_list,
|
|
'ChoosePayment' => 'ATM',
|
|
'EncryptType' => 1,
|
|
// 'OrderResultURL' => 'https://shop.h888.fun/appapi/v1/payment/response/paycode/eccvs/',
|
|
// 'ClientBackURL' => 'https://shop.h888.fun/m/',
|
|
'ReturnURL' => getUrl().'/appapi/v1/payment/callback/paycode/ecatm/',
|
|
'ClientRedirectURL' => getUrl().'/appapi/v1/payment/response/paycode/ecatm/',
|
|
];
|
|
$action = $this->api_url .'/Cashier/AioCheckOut/V5';
|
|
|
|
$result = $autoSubmitFormService->generate($input, $action);
|
|
|
|
return ['code'=>200,'method'=>'post','data'=>$result];
|
|
}
|
|
|
|
public function response($data){
|
|
$order_sn = $data['MerchantTradeNo'];
|
|
|
|
if($data['RtnCode'] == '2'){
|
|
$code = 200;
|
|
$result['pay_status'] = '1';
|
|
$result['pay_time'] = 0;
|
|
$result['pay_token'] = $data['TradeNo'];
|
|
$result['pay_data'] = json_encode($data);
|
|
|
|
}else{
|
|
$code = 500;
|
|
$result['pay_status'] = '0';
|
|
$result['pay_time'] = 0;
|
|
$result['pay_token'] = $data['TradeNo'];
|
|
$result['pay_data'] = json_encode($data);
|
|
}
|
|
|
|
Db::name('order_info')
|
|
->where('order_sn',$order_sn)
|
|
->update($result);
|
|
|
|
$rtn = [
|
|
'code' => $code,
|
|
'paycode' => 'ecatm',
|
|
'order_sn' => $order_sn,
|
|
'BankCode' => $data['BankCode'],
|
|
'vAccount' => $data['vAccount'],
|
|
'ExpireDate' => $data['ExpireDate'],
|
|
'TradeAmt' => $data['TradeAmt'],
|
|
];
|
|
|
|
return $rtn;
|
|
}
|
|
|
|
public function callback($data){
|
|
$order_sn = $data['MerchantTradeNo'];
|
|
|
|
$order = Db::name('order_info')
|
|
->where('order_sn', $order_sn)
|
|
->find();
|
|
|
|
if ($data['RtnCode'] == 1) {
|
|
|
|
$result['pay_status'] = '2';
|
|
$result['pay_time'] = strtotime($data['PaymentDate']);
|
|
$result['pay_data'] = json_encode($data);
|
|
|
|
try {
|
|
//更新訂單狀態
|
|
Db::name('order_info')
|
|
->where('order_sn', $order_sn)
|
|
->update($result);
|
|
|
|
//更新訂單操縱紀錄
|
|
$order_action = [
|
|
'order_id' => $order['order_id'],
|
|
'action_user' => '綠界科技',
|
|
'order_status' => $order['order_status'],
|
|
'shipping_status' => $order['shipping_status'],
|
|
'pay_status' => '2',
|
|
'action_note' => '綠界金流ATM: ' . $data['PaymentType'] . ',付款成功',
|
|
'log_time' => time(),
|
|
];
|
|
Db::name('order_action')->insert($order_action);
|
|
} catch (\Exception $e) {
|
|
throw new \Exception($e->getMessage());
|
|
}
|
|
$code = 200;
|
|
$message = '付款成功';
|
|
} else {
|
|
$code = $data['RtnCode'];
|
|
$message = $data['RtnMsg'];
|
|
$result['pay_data'] = json_encode($data);
|
|
}
|
|
|
|
|
|
$rtn = [
|
|
'code' => $code,
|
|
'paycode' => 'ecatm',
|
|
'msg' => $message,
|
|
'order_sn' => $order_sn,
|
|
];
|
|
|
|
return $rtn;
|
|
}
|
|
}
|