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.

163 lines
4.9 KiB

<?php
namespace app\common\payment;
use think\facade\Db;
use app\common\payment\Ipayment;
use asc\line\LinePay as LinePayObj;
//實作金流串接介面
class LinePay implements Ipayment
{
public function pay($order)
{
$product_list = [];
foreach ($order['goods_list'] as $goods) {
$product_list[] = [
'name' => $goods['goods_name'],
'quantity' => $goods['goods_number'],
'price' => intval($goods['goods_price'])
];
}
$r_data = [
'amount' => $order['order_amount'],
'currency' => 'TWD',
'orderId' => $order['order_sn'],
'packages' => [
[
'id' => $order['order_sn'],
'amount' => $order['goods_amount'],
'name' => 'SlashCard Store',
'products' => $product_list,
]
],
'redirectUrls' => [
'confirmUrl' => getUrl() . '/appapi/v1/payment/response/paycode/linepay/',
'cancelUrl' => getUrl() . '/appapi/v1/payment/cancel/paycode/linepay/',
],
];
$lp = new LinePayObj('1657811805', '53a912dfa167b5e767847c7e9fca4ea1');
$result = $lp->request($r_data);
if ($result['returnCode'] != '0000') {
return ['code' => $result['returnCode']];
}
Db::name('order_info')
->where('order_sn', $order['order_sn'])
->update(['pay_token' => $result['info']['paymentAccessToken'], 'pay_data' => json_encode($result['info'])]);
//更新訂單資料
return ['code' => 200, 'method' => 'redirect', 'data' => $result['info']];
}
public function response($data)
{
$message = '';
$amount = Db::name('order_info')
->where('order_sn', $data['orderId'])
->value('order_amount');
$r_data = [
'amount' => $amount,
'currency' => 'TWD',
];
$lp = new LinePayObj('1657811805', '53a912dfa167b5e767847c7e9fca4ea1');
$result = $lp->confirm($data['transactionId'], $r_data);
if ($result['returnCode'] != '0000') {
return [
'code' => $result['returnCode'],
'paycode' => 'linepay',
'order_sn' => $data['orderId'],
];
}
//更新訂單付款狀態
try {
Db::name('order_info')
->where('order_sn', $data['orderId'])
->update([
'pay_status' => 2,
'pay_time' => time(),
'pay_token' => $data['transactionId'],
]);
$order = Db::name('order_info')
->where('order_sn', $data['orderId'])
->find();
//更新訂單操縱紀錄
$order_action = [
'order_id' => $order['order_id'],
'action_user' => 'Line',
'order_status' => $order['order_status'],
'shipping_status' => $order['shipping_status'],
'pay_status' => '2',
'action_note' => 'LinePay: ' . $data['transactionId'] . ',付款成功',
'log_time' => time(),
];
Db::name('order_action')->insert($order_action);
$code = 200;
} catch (\Exception $e) {
$code = 500;
}
//判斷是否為超商取貨
$shipping_code = Db::name('shipping')->where('shipping_id', $order['shipping_id'])->value('shipping_code');
if ($shipping_code == 'ecpay') {
$rtn = \app\common\shipping\Shipping::createShipping('ecpay', $order['order_sn']);
if ($rtn['code']!=200) {
$code = 501;
$message = '付款成功,建立物流單失敗';
} else {
$code = 200;
}
}
//判斷是否為SlashCard商品
$is_main = Db::name('order_goods')
->where('order_id', $order['order_id'])
->where('goods_id', 1)
->find();
if ($is_main) {
$rtn = \app\service\Card::addUser([
'order_sn' => $order['order_sn'],
'user_id' => Db::name('users')->where('user_id', $order['user_id'])->value('sso_user_id'),
]);
if (!$rtn['code'] != 200) {
$code = 503;
$message = '付款成功,建立卡片失敗';
} else {
$code = 200;
Db::name('users')->where('user_id', $order['user_id'])->update(['is_validated' => 1]);
}
}
$rtn = [
'code' => $code,
'paycode' => 'linepay',
'order_sn' => $data['orderId'],
'message' => $message,
];
return $rtn;
}
public function callback($data)
{
return ['code' => 404];
}
}