654 lines
23 KiB
PHP
654 lines
23 KiB
PHP
|
<?php
|
|||
|
|
|||
|
/*
|
|||
|
* 支付相关处理
|
|||
|
*/
|
|||
|
|
|||
|
namespace app\home\controller;
|
|||
|
use think\facade\View;
|
|||
|
use think\facade\Lang;
|
|||
|
use think\facade\Db;
|
|||
|
use Stripe\Stripe;
|
|||
|
/**
|
|||
|
* ============================================================================
|
|||
|
* 联课教育商城系统
|
|||
|
* ============================================================================
|
|||
|
* 版权所有 2022 刻羽互动科技有限公司,并保留所有权利。
|
|||
|
* 网站地址: http://www.o1h.cn
|
|||
|
* ----------------------------------------------------------------------------
|
|||
|
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用 .
|
|||
|
* 不允许对程序代码以任何形式任何目的的再发布。
|
|||
|
* ============================================================================
|
|||
|
* 控制器
|
|||
|
*/
|
|||
|
class Payment extends BaseMall {
|
|||
|
|
|||
|
|
|||
|
private static $key;
|
|||
|
private static $test;
|
|||
|
|
|||
|
public function initialize() {
|
|||
|
parent::initialize(); // TODO: Change the autogenerated stub
|
|||
|
Lang::load(base_path() . 'home/lang/'.config('lang.default_lang').'/buy.lang.php');
|
|||
|
self::$key = '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';
|
|||
|
|
|||
|
self::$test = 'sk_test_51KGYh8LqMBqucQSD5wsRQmjy96oRuMu4fx4PwNle6rVovtZU8KKC9CFVHafye62bj6M0CPzFc3iCJUFPWA3Xd8s1005wLqg10M';
|
|||
|
}
|
|||
|
|
|||
|
private function use_predeposit($order_info, $post, $virtual = 0) {
|
|||
|
if ($virtual) {
|
|||
|
|
|||
|
$logic_buy = model('buyvirtual', 'logic');
|
|||
|
} else {
|
|||
|
|
|||
|
$logic_buy = model('buy_1', 'logic');
|
|||
|
}
|
|||
|
if (empty($post['password'])) {
|
|||
|
return $order_info;
|
|||
|
}
|
|||
|
$member_model = model('member');
|
|||
|
$buyer_info = $member_model->getMemberInfoByID(session('member_id'));
|
|||
|
if ($buyer_info['member_paypwd'] == '' || $buyer_info['member_paypwd'] != md5($post['password'])) {
|
|||
|
return $order_info;
|
|||
|
}
|
|||
|
if ($buyer_info['available_rc_balance'] == 0) {
|
|||
|
$post['rcb_pay'] = null;
|
|||
|
}
|
|||
|
if ($buyer_info['available_predeposit'] == 0) {
|
|||
|
$post['pd_pay'] = null;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
try {
|
|||
|
Db::startTrans();
|
|||
|
|
|||
|
|
|||
|
if (!empty($post['rcb_pay'])) {
|
|||
|
$order_info = $logic_buy->rcbPay($order_info, $post, $buyer_info);
|
|||
|
}
|
|||
|
|
|||
|
if (!empty($post['pd_pay'])) {
|
|||
|
$order_info = $logic_buy->pdPay($order_info, $post, $buyer_info);
|
|||
|
}
|
|||
|
|
|||
|
Db::commit();
|
|||
|
} catch (\Exception $e) {
|
|||
|
Db::rollback();
|
|||
|
exit($e->getMessage());
|
|||
|
}
|
|||
|
|
|||
|
return $order_info;
|
|||
|
}
|
|||
|
|
|||
|
private function get_order_info($result) {
|
|||
|
//计算本次需要在线支付的订单总金额
|
|||
|
$pay_amount = 0;
|
|||
|
$pay_order_id_list = array();
|
|||
|
if (!empty($result['data']['order_list'])) {
|
|||
|
foreach ($result['data']['order_list'] as $order_info) {
|
|||
|
if ($order_info['order_state'] == ORDER_STATE_NEW) {
|
|||
|
$pay_amount += $order_info['order_amount'] - $order_info['pd_amount'] - $order_info['rcb_amount'];
|
|||
|
$pay_order_id_list[] = $order_info['order_id'];
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (round($pay_amount,2) == 0) {
|
|||
|
$result['data']['pay_end'] = 1;
|
|||
|
} else {
|
|||
|
$result['data']['pay_end'] = 0;
|
|||
|
}
|
|||
|
$result['data']['api_pay_amount'] = ds_price_format($pay_amount);
|
|||
|
//临时注释
|
|||
|
if (!empty($pay_order_id_list)) {
|
|||
|
$update = model('order')->editOrder(array('payment_time'=>TIMESTAMP), array(array('order_id', 'in', $pay_order_id_list)));
|
|||
|
// if (!$update) {
|
|||
|
// exit('更新订单信息发生错误,请重新支付');//因为微信支付时会重定向获取openid所以会更新两次
|
|||
|
// }
|
|||
|
}
|
|||
|
//如果是开始支付尾款,则把支付单表重置了未支付状态,因为支付接口通知时需要判断这个状态
|
|||
|
if (isset($result['data']['if_buyer_repay'])) {
|
|||
|
$update = model('order')->editOrderpay(array('api_paystate' => 0), array('pay_id' => $result['data']['pay_id']));
|
|||
|
if (!$update) {
|
|||
|
exit(lang('order_pay_fail'));
|
|||
|
}
|
|||
|
$result['data']['api_paystate'] = 0;
|
|||
|
}
|
|||
|
return $result;
|
|||
|
}
|
|||
|
private function get_vr_order_info($result) {
|
|||
|
//计算本次需要在线支付的订单总金额
|
|||
|
$pay_amount = 0;
|
|||
|
if ($result['data']['order_state'] == ORDER_STATE_NEW) {
|
|||
|
$pay_amount += $result['data']['order_amount'] - $result['data']['pd_amount'] - $result['data']['rcb_amount'];
|
|||
|
}
|
|||
|
|
|||
|
if ($pay_amount == 0) {
|
|||
|
$result['data']['pay_end'] = 1;
|
|||
|
} else {
|
|||
|
$result['data']['pay_end'] = 0;
|
|||
|
}
|
|||
|
|
|||
|
$result['data']['api_pay_amount'] = ds_price_format($pay_amount);
|
|||
|
//临时注释
|
|||
|
//$update = model('order')->editOrder(array('api_pay_time'=>TIMESTAMP),array('order_id'=>$result['data']['order_id']));
|
|||
|
//if(!$update) {
|
|||
|
// return array('error' => '更新订单信息发生错误,请重新支付');
|
|||
|
//}
|
|||
|
//计算本次需要在线支付的订单总金额
|
|||
|
$pay_amount = $result['data']['order_amount'] - $result['data']['pd_amount'] - $result['data']['rcb_amount'];
|
|||
|
$result['data']['api_pay_amount'] = ds_price_format($pay_amount);
|
|||
|
|
|||
|
return $result;
|
|||
|
}
|
|||
|
/**
|
|||
|
* 实物商品订单
|
|||
|
*/
|
|||
|
public function real_order() {
|
|||
|
$pay_sn = input('post.pay_sn');
|
|||
|
$payment_code = input('post.payment_code');
|
|||
|
$url = url('Memberorder/index');
|
|||
|
|
|||
|
|
|||
|
if (!preg_match('/^\d{20}$/', $pay_sn)) {
|
|||
|
$this->error(lang('param_error'), $url);
|
|||
|
}
|
|||
|
$logic_payment = model('payment', 'logic');
|
|||
|
$result = $logic_payment->getPaymentInfo($payment_code);
|
|||
|
|
|||
|
if (!$result['code']) {
|
|||
|
$this->error($result['msg'], $url);
|
|||
|
}
|
|||
|
$payment_info = $result['data'];
|
|||
|
//计算所需支付金额等支付单信息
|
|||
|
$result = $logic_payment->getRealOrderInfo($pay_sn, session('member_id'));
|
|||
|
if (!$result['code']) {
|
|||
|
$this->error($result['msg'], $url);
|
|||
|
}
|
|||
|
if ($result['data']['api_paystate'] || empty($result['data']['api_pay_amount'])) {
|
|||
|
$this->error(lang('no_payment_required_this_order'), $url);
|
|||
|
}
|
|||
|
$result['data']['order_list'] = $this->use_predeposit($result['data']['order_list'], input('param.'), 0);
|
|||
|
$result = $this->get_order_info($result);
|
|||
|
if ($result['data']['pay_end'] == 1) {
|
|||
|
//站内支付了全款
|
|||
|
$this->redirect($url);return;
|
|||
|
}
|
|||
|
//转到第三方API支付
|
|||
|
$this->_api_pay($result['data'], $payment_info);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 虚拟商品购买
|
|||
|
*/
|
|||
|
public function vr_order() {
|
|||
|
$order_sn = input('post.order_sn');
|
|||
|
$payment_code = input('post.payment_code');
|
|||
|
$url = url('Membervrorder/index');
|
|||
|
|
|||
|
if (!preg_match('/^\d{20}$/', $order_sn)) {
|
|||
|
$this->error(lang('param_error'));
|
|||
|
}
|
|||
|
|
|||
|
$logic_payment = model('payment', 'logic');
|
|||
|
$result = $logic_payment->getPaymentInfo($payment_code);
|
|||
|
if (!$result['code']) {
|
|||
|
$this->error($result['msg'], $url);
|
|||
|
}
|
|||
|
$payment_info = $result['data'];
|
|||
|
|
|||
|
//计算所需支付金额等支付单信息
|
|||
|
$result = $logic_payment->getVrOrderInfo($order_sn, session('member_id'));
|
|||
|
if (!$result['code']) {
|
|||
|
$this->error($result['msg'], $url);
|
|||
|
}
|
|||
|
|
|||
|
if ($result['data']['order_state'] != ORDER_STATE_NEW || empty($result['data']['api_pay_amount'])) {
|
|||
|
$this->error(lang('no_payment_required_this_order'), $url);
|
|||
|
}
|
|||
|
$result['data'] = $this->use_predeposit($result['data'], input('param.'), 1);
|
|||
|
$result = $this->get_vr_order_info($result);
|
|||
|
if ($result['data']['pay_end'] == 1) {
|
|||
|
$this->redirect($url);return;
|
|||
|
}
|
|||
|
//转到第三方API支付
|
|||
|
$this->_api_pay($result['data'], $payment_info);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 预存款充值
|
|||
|
*/
|
|||
|
public function pd_order() {
|
|||
|
$pdr_sn = input('param.pdr_sn');
|
|||
|
$payment_code = input('param.payment_code');
|
|||
|
$url = url('Predeposit/index');
|
|||
|
|
|||
|
if (!preg_match('/^\d{20}$/', $pdr_sn)) {
|
|||
|
$this->error(lang('param_error'), $url);
|
|||
|
}
|
|||
|
|
|||
|
$logic_payment = model('payment', 'logic');
|
|||
|
$result = $logic_payment->getPaymentInfo($payment_code);
|
|||
|
if (!$result['code']) {
|
|||
|
$this->error($result['msg'], $url);
|
|||
|
}
|
|||
|
$payment_info = $result['data'];
|
|||
|
$result = $logic_payment->getPdOrderInfo($pdr_sn, session('member_id'));
|
|||
|
if (!$result['code']) {
|
|||
|
$this->error($result['msg'], $url);
|
|||
|
}
|
|||
|
if ($result['data']['pdr_payment_state'] || empty($result['data']['api_pay_amount'])) {
|
|||
|
$this->error(lang('no_payment_required'), $url);
|
|||
|
}
|
|||
|
|
|||
|
//转到第三方API支付
|
|||
|
$this->_api_pay($result['data'], $payment_info);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 第三方在线支付接口
|
|||
|
*
|
|||
|
*/
|
|||
|
private function _api_pay($order_info, $payment_info) {
|
|||
|
try{
|
|||
|
$payment_api = new $payment_info['payment_code']($payment_info);
|
|||
|
}catch(\Exception $e){
|
|||
|
$this->error($e->getMessage());
|
|||
|
}
|
|||
|
if (in_array($payment_info['payment_code'],array('wxpay_native','allinpay'))) {
|
|||
|
if (!extension_loaded('curl')) {
|
|||
|
$this->error(lang('please_check_system_configuration'));
|
|||
|
}
|
|||
|
|
|||
|
if (array_key_exists('order_list', $order_info)) {
|
|||
|
View::assign('order_list', $order_info['order_list']);
|
|||
|
View::assign('args', 'buyer_id=' . session('member_id') . '&pay_id=' . $order_info['pay_id']);
|
|||
|
} else {
|
|||
|
View::assign('order_list', array());
|
|||
|
if ($order_info['order_type'] == 'pd_order') {
|
|||
|
View::assign('args', 'buyer_id=' . session('member_id') . '&pdr_sn=' . $order_info['pdr_sn']);
|
|||
|
} else {
|
|||
|
View::assign('args', 'buyer_id=' . session('member_id') . '&order_id=' . (isset($order_info['order_id']) ? $order_info['order_id'] : ''));
|
|||
|
}
|
|||
|
}
|
|||
|
View::assign('api_pay_amount', $order_info['api_pay_amount']);
|
|||
|
try{
|
|||
|
$pay_url=base64_encode(ds_encrypt($payment_api->get_payform($order_info), MD5_KEY));
|
|||
|
}catch(\Exception $e){
|
|||
|
$this->error($e->getMessage());
|
|||
|
}
|
|||
|
|
|||
|
View::assign('pay_url', $pay_url);
|
|||
|
View::assign('nav_list', rkcache('nav', true));
|
|||
|
if($payment_info['payment_code']=='wxpay_native'){
|
|||
|
$pay_method=lang('pay_method_wechat');
|
|||
|
}elseif($payment_info['payment_code']=='allinpay'){
|
|||
|
$paytype=input('param.paytype');
|
|||
|
switch($paytype){
|
|||
|
case 'W01':
|
|||
|
$pay_method=lang('pay_method_wechat');
|
|||
|
break;
|
|||
|
case 'A01':
|
|||
|
$pay_method=lang('pay_method_alipay');
|
|||
|
break;
|
|||
|
case 'Q01':
|
|||
|
$pay_method=lang('pay_method_tenpay');
|
|||
|
break;
|
|||
|
case 'U01':
|
|||
|
$pay_method=lang('pay_method_unionpay');
|
|||
|
break;
|
|||
|
default:
|
|||
|
$this->error(lang('please_check_system_configuration'));
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
View::assign('pay_method',$pay_method);
|
|||
|
echo View::fetch($this->template_dir . 'wxpay');
|
|||
|
} else {
|
|||
|
try{
|
|||
|
$pay_url=$payment_api->get_payform($order_info);
|
|||
|
}catch(\Exception $e){
|
|||
|
$this->error($e->getMessage());
|
|||
|
}
|
|||
|
@header("Location: " . $pay_url);
|
|||
|
}
|
|||
|
exit();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* 二维码显示(微信扫码支付)
|
|||
|
*/
|
|||
|
public function qrcode() {
|
|||
|
$data = base64_decode(input('data'));
|
|||
|
$data = ds_decrypt($data, MD5_KEY, 30);
|
|||
|
include_once root_path(). 'extend/qrcode/phpqrcode.php';
|
|||
|
\QRcode::png($data);
|
|||
|
}
|
|||
|
/**
|
|||
|
* 扫码支付结果判断
|
|||
|
*/
|
|||
|
public function query_state() {
|
|||
|
if (intval(input('param.pay_id')) > 0) {
|
|||
|
$info = model('order')->getOrderpayInfo(array(
|
|||
|
'pay_id' => intval(input('param.pay_id')),
|
|||
|
'buyer_id' => intval(input('param.buyer_id'))
|
|||
|
));
|
|||
|
exit(json_encode(array(
|
|||
|
'state' => ($info['api_paystate'] == '1'), 'pay_sn' => $info['pay_sn'], 'type' => 'real_order'
|
|||
|
)));
|
|||
|
} elseif (intval(input('param.order_id')) > 0) {
|
|||
|
$info = model('vrorder')->getVrorderInfo(array(
|
|||
|
'order_id' => intval(input('param.order_id')),
|
|||
|
'buyer_id' => intval(input('param.buyer_id'))
|
|||
|
));
|
|||
|
exit(json_encode(array(
|
|||
|
'state' => ($info['order_state'] == '20'), 'pay_sn' => $info['order_sn'], 'type' => 'vr_order'
|
|||
|
)));
|
|||
|
} else {
|
|||
|
$result = model('payment', 'logic')->getPdOrderInfo(input('param.pdr_sn'), input('param.buyer_id'));
|
|||
|
exit(json_encode(array('state' => $result['code'] && $result['data']['pdr_payment_state'], 'pdr_sn' => $result['code']?$result['data']['pay_sn']:'', 'type' => 'pd_order')));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @param type $payment_code 共用回调方法
|
|||
|
* @param type $show_code 实际支付方式名称
|
|||
|
*/
|
|||
|
public function notify($payment_code,$show_code='') {
|
|||
|
$logic_payment = model('payment', 'logic');
|
|||
|
$result = $logic_payment->getPaymentInfo($payment_code);
|
|||
|
$payment_info = $result['data'];
|
|||
|
if($show_code){
|
|||
|
$result = $logic_payment->getPaymentInfo($show_code);
|
|||
|
$payment_info['payment_config'] = array_merge($payment_info['payment_config'],$result['data']['payment_config']);
|
|||
|
}
|
|||
|
//创建支付接口对象
|
|||
|
$payment_api = new $payment_code($payment_info);
|
|||
|
|
|||
|
//对进入的参数进行远程数据判断
|
|||
|
$verify = $payment_api->verify_notify();
|
|||
|
if ($verify['trade_status'] != 1) {
|
|||
|
exit;
|
|||
|
}
|
|||
|
$out_trade_no = $verify['out_trade_no']; #内部订单号
|
|||
|
$trade_no = $verify['trade_no']; #交易订单号
|
|||
|
$order_type = $verify['order_type']; #交易类型
|
|||
|
|
|||
|
$update_result = $logic_payment->updateOrder($out_trade_no, $trade_no, $order_type, $show_code?$show_code:$payment_code);
|
|||
|
exit($update_result ? 'success' : 'fail');
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* 支付接口同步返回路径
|
|||
|
*/
|
|||
|
public function alipay_return() {
|
|||
|
$result = explode('-', input('param.out_trade_no'));
|
|||
|
$out_trade_no = $result['1']; //返回的支付单号
|
|||
|
$order_type = $result['0'];
|
|||
|
$order_amount = input('param.total_amount'); //订单金额
|
|||
|
$trade_no = input('param.trade_no');
|
|||
|
$payment_code = 'alipay';
|
|||
|
|
|||
|
$logic_payment = model('payment', 'logic');
|
|||
|
//取得支付方式
|
|||
|
$result = $logic_payment->getPaymentInfo($payment_code);
|
|||
|
if (!$result['code']) {
|
|||
|
$this->error($result['msg'], 'Memberorder/index');
|
|||
|
}
|
|||
|
$payment_info = $result['data'];
|
|||
|
|
|||
|
//创建支付接口对象
|
|||
|
$payment_api = new $payment_info['payment_code']($payment_info);
|
|||
|
|
|||
|
//返回参数判断
|
|||
|
$verify = $payment_api->return_verify();
|
|||
|
if (!$verify) {
|
|||
|
$this->error(lang('payment_data_validation_failed'), 'Memberorder/index');
|
|||
|
}
|
|||
|
|
|||
|
//支付成功后跳转
|
|||
|
if ($order_type == 'real_order') {
|
|||
|
$pay_ok_url = '/buy/pay_ok?pay_sn=' . $out_trade_no . '&pay_amount=' . ds_price_format($order_amount);
|
|||
|
} elseif ($order_type == 'vr_order') {
|
|||
|
$pay_ok_url = '/buyvirtual/pay_ok?order_sn=' . $out_trade_no . '&order_amount=' . ds_price_format($order_amount);
|
|||
|
} elseif ($order_type == 'pd_order') {
|
|||
|
$pay_ok_url = '/predeposit/index';
|
|||
|
}
|
|||
|
header("Location:$pay_ok_url");
|
|||
|
exit;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//测试stripe支付
|
|||
|
public function pay()
|
|||
|
{
|
|||
|
|
|||
|
return View::fetch($this->template_dir.'pay');
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//stripe支付异步通知
|
|||
|
public function stripe_notify()
|
|||
|
{
|
|||
|
$payload = @file_get_contents('php://input');
|
|||
|
file_put_contents('1.txt', $payload, FILE_APPEND);
|
|||
|
|
|||
|
require_once root_path() . 'vendor/autoload.php';
|
|||
|
require_once root_path() . 'vendor/stripe/stripe-php/init.php';
|
|||
|
|
|||
|
\Stripe\Stripe::setApiKey(self::$key);
|
|||
|
// $payload = file_get_contents('https://light.haix.cn/1.txt');
|
|||
|
|
|||
|
$event = null;
|
|||
|
try {
|
|||
|
$event = \Stripe\Event::constructFrom(
|
|||
|
json_decode($payload, true)
|
|||
|
);
|
|||
|
} catch(\UnexpectedValueException $e) {
|
|||
|
// Invalid payload
|
|||
|
// http_response_code(400);
|
|||
|
exit();
|
|||
|
}
|
|||
|
|
|||
|
$payment_intent = '';
|
|||
|
// Handle the event
|
|||
|
switch ($event->type) {
|
|||
|
case 'charge.succeeded':
|
|||
|
$succeeded = $event->data->object;
|
|||
|
$content = json_encode($succeeded);
|
|||
|
|
|||
|
if ($succeeded->status == 'succeeded'){
|
|||
|
$payment_intent = $succeeded->payment_intent;
|
|||
|
}
|
|||
|
break;
|
|||
|
default:
|
|||
|
echo 'Received unknown event type ' . $event->type;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
if (empty($payment_intent)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
$order_model = model('order');
|
|||
|
$logic_payment = model('payment', 'logic');
|
|||
|
$o = $order_model->getOrderBy($payment_intent);
|
|||
|
|
|||
|
$order = $logic_payment->getRealOrderInfo($o['pay_sn']);
|
|||
|
|
|||
|
$order_list = $order['data']['order_list'];
|
|||
|
|
|||
|
|
|||
|
$result = $logic_payment->updateRealOrder($o['pay_sn'], 'stripe', $order_list, $payment_intent);
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//stripe支付
|
|||
|
public function stripe()
|
|||
|
{
|
|||
|
$pay_sn = input('post.pay_sn');
|
|||
|
$payment_code = input('post.payment_code');
|
|||
|
$url = '/Memberorder/index.html';
|
|||
|
|
|||
|
|
|||
|
if (!preg_match('/^\d{20}$/', $pay_sn)) {
|
|||
|
$this->error(lang('param_error'), $url);
|
|||
|
}
|
|||
|
$logic_payment = model('payment', 'logic');
|
|||
|
$result = $logic_payment->getPaymentInfo($payment_code);
|
|||
|
|
|||
|
|
|||
|
$payment_info = $result['data'];
|
|||
|
|
|||
|
//计算所需支付金额等支付单信息
|
|||
|
$result = $logic_payment->getRealOrderInfo($pay_sn, session('member_id'));
|
|||
|
|
|||
|
if (!$result['code']) {
|
|||
|
$this->error($result['msg'], $url);
|
|||
|
}
|
|||
|
if ($result['data']['api_paystate'] || empty($result['data']['api_pay_amount'])) {
|
|||
|
$this->error(lang('no_payment_required_this_order'), $url);
|
|||
|
}
|
|||
|
$result['data']['order_list'] = $this->use_predeposit($result['data']['order_list'], input('param.'), 0);
|
|||
|
$result = $this->get_order_info($result);
|
|||
|
if ($result['data']['pay_end'] == 1) {
|
|||
|
//站内支付了全款
|
|||
|
$this->redirect($url);return;
|
|||
|
}
|
|||
|
|
|||
|
$order_model = model('order');
|
|||
|
$detail = $order_model->getOrdergoodsInfo(['order_id' => $result['data']['order_list'][0]['order_id']]);
|
|||
|
|
|||
|
|
|||
|
//新的
|
|||
|
$product = [
|
|||
|
'name' => 'Order Number:' . $pay_sn ,
|
|||
|
'images' => [
|
|||
|
'http://test.lightcourse.com/static/home/new/images/logo.png',
|
|||
|
]
|
|||
|
];
|
|||
|
$amount = intval($result['data']['api_pay_amount']) * 100;
|
|||
|
|
|||
|
$result = self::stripePay($product, $amount, $result['data']['order_list'][0]['order_id']);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* Stripe支付
|
|||
|
* @access private
|
|||
|
* @author super
|
|||
|
* @date 2020-11-04
|
|||
|
* @param array $product 商品信息
|
|||
|
* @param int|float $amount 支付金额
|
|||
|
* @param array $pay_type 支付类型
|
|||
|
* @param string $currency 货币类型 小写
|
|||
|
* @return array
|
|||
|
*/
|
|||
|
private static function stripePay($product, $amount, $order_id, $pay_type = ['card'], $currency = 'usd')
|
|||
|
{
|
|||
|
|
|||
|
require_once root_path() . 'vendor/autoload.php';
|
|||
|
require_once root_path() . 'vendor/stripe/stripe-php/init.php';
|
|||
|
|
|||
|
\Stripe\Stripe::setApiKey(self::$key);
|
|||
|
|
|||
|
header('Content-Type: application/json');
|
|||
|
|
|||
|
$YOUR_DOMAIN = 'http://test.lightcourse.com/';
|
|||
|
|
|||
|
$checkout_session = \Stripe\Checkout\Session::create([
|
|||
|
'payment_method_types' => $pay_type,
|
|||
|
'line_items' => [[
|
|||
|
'price_data' => [
|
|||
|
'currency' => $currency,
|
|||
|
'unit_amount' => $amount,
|
|||
|
'product_data' => $product
|
|||
|
],
|
|||
|
'quantity' => 1,
|
|||
|
]],
|
|||
|
'mode' => 'payment',
|
|||
|
'success_url' => $YOUR_DOMAIN . '/buy/succ?order_id='.$order_id, // 支付成功后跳转url
|
|||
|
'cancel_url' => $YOUR_DOMAIN . '/Memberorder/index.html', // 支付失败后跳转url
|
|||
|
]);
|
|||
|
|
|||
|
// var_dump($checkout_session->url);die;
|
|||
|
$jump = $checkout_session->url;
|
|||
|
|
|||
|
//return ['id' => $checkout_session->id, 'payment_intent' => $checkout_session->payment_intent];
|
|||
|
// payment_intent是识别支付与通知关系的唯一凭证
|
|||
|
$order_model = model('order');
|
|||
|
$intent = $checkout_session->payment_intent;
|
|||
|
|
|||
|
$order_model->editOrder(array('trade_no'=>$intent), array(
|
|||
|
'order_id' => $order_id));
|
|||
|
|
|||
|
header("location:$jump");exit();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* 通联异步通知
|
|||
|
*/
|
|||
|
public function allinpay_notify(){
|
|||
|
$this->notify('allinpay');
|
|||
|
}
|
|||
|
/**
|
|||
|
* 微信扫码支付异步通知
|
|||
|
*/
|
|||
|
public function wxpay_native_notify() {
|
|||
|
$this->notify('wxpay_native');
|
|||
|
}
|
|||
|
/**
|
|||
|
* 小程序支付异步通知
|
|||
|
*/
|
|||
|
public function wxpay_minipro_notify() {
|
|||
|
$this->notify('wxpay_native','wxpay_minipro');
|
|||
|
}
|
|||
|
/**
|
|||
|
* 微信支付支付异步通知
|
|||
|
*/
|
|||
|
public function wxpay_jsapi_notify() {
|
|||
|
$this->notify('wxpay_native','wxpay_jsapi');
|
|||
|
}
|
|||
|
/**
|
|||
|
* 微信H5支付异步通知
|
|||
|
*/
|
|||
|
public function wxpay_h5_notify() {
|
|||
|
$this->notify('wxpay_native','wxpay_h5');
|
|||
|
}
|
|||
|
/**
|
|||
|
* 微信APP支付异步通知
|
|||
|
*/
|
|||
|
public function wxpay_app_notify() {
|
|||
|
$this->notify('wxpay_native','wxpay_app');
|
|||
|
}
|
|||
|
/**
|
|||
|
* 通知处理(支付宝异步对账)
|
|||
|
*/
|
|||
|
public function alipay_notify() {
|
|||
|
$this->notify('alipay');
|
|||
|
}
|
|||
|
/**
|
|||
|
* 支付宝APP支付异步通知
|
|||
|
*/
|
|||
|
public function alipay_app_notify() {
|
|||
|
$this->notify('alipay_app');
|
|||
|
}
|
|||
|
/**
|
|||
|
* 支付宝wap支付异步通知
|
|||
|
*/
|
|||
|
public function alipay_h5_notify() {
|
|||
|
$this->notify('alipay','alipay_h5');
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
?>
|