674 行
32 KiB
PHP
可执行文件
674 行
32 KiB
PHP
可执行文件
<?php
|
||
|
||
namespace Pay\Controller;
|
||
|
||
use Common\Model\RetailPayOrderModel;
|
||
use Think\Controller;
|
||
|
||
//[1.8.53]
|
||
|
||
/**
|
||
* 星POS接口文档信息
|
||
* @author Administrator
|
||
*/
|
||
class PayContinentController extends BaseController
|
||
{
|
||
// 网关 测试环境 adpweb/ehpspos3
|
||
// static private $gatewayUrl = "http://sandbox.starpos.com.cn/adpweb/ehpspos3";
|
||
static private $OrgNo;
|
||
static private $Key;
|
||
static private $trmNo;
|
||
static private $mercId;
|
||
// 网关 正式环境
|
||
static private $gatewayUrl = "http://gateway.starpos.com.cn/adpweb/ehpspos3";
|
||
|
||
public function _initialize()
|
||
{
|
||
//判断当前调用类的身份
|
||
$cache = M('continent_config')->find();
|
||
self::$OrgNo = $cache['continent_number'];
|
||
self::$Key = ''; // 商户秘钥
|
||
self::$trmNo = '';
|
||
self::$mercId = '';
|
||
}
|
||
|
||
/**
|
||
* 调用该方法 给机构号和商户秘钥赋值
|
||
*/
|
||
public function orN($merchant_id)
|
||
{
|
||
$merchants = M('merchant_infos')->where(array('merchant_id' => $merchant_id))->find();
|
||
if (!empty($merchants)) {
|
||
self::$Key = $merchants['key']; // 商户秘钥
|
||
self::$trmNo = $merchants['trm_no'];
|
||
self::$mercId = $merchants['merc_id'];
|
||
}
|
||
}
|
||
|
||
/** 商户支付
|
||
* @param $param
|
||
* @return array
|
||
*/
|
||
public function execute($tradeNo, $merchantid, $opens = '2')
|
||
{
|
||
$this->orN($merchantid);
|
||
$arrData['opSys'] = 0; //操作系统
|
||
$arrData['characterSet'] = '00';
|
||
$arrData['orgNo'] = self::$OrgNo;
|
||
$arrData['mercId'] = self::$mercId; //商户号 $param['mercId']
|
||
$arrData['version'] = $opens == 1 ? 'V1.0.2' : 'V1.0.1'; //版本号
|
||
$arrData['trmNo'] = self::$trmNo; //设备号 $param['trmNo']
|
||
$arrData['tradeNo'] = $tradeNo; //商户端订单号 $param['tradeNO']
|
||
$arrData['txnTime'] = date('YmdHis'); //设备端交易时间 时间戳格式$ param['txnTime']
|
||
$arrData['signType'] = 'MD5'; //签名方式
|
||
return $arrData;
|
||
}
|
||
|
||
//authCode=134765203426838443&payChannel=‘WXPAY’&subject=测试支付&amount=0.01&total_amount=0.01
|
||
//微信公众号查询
|
||
public function pubSigQrys($merchantid)
|
||
{
|
||
|
||
$this->orN($merchantid);
|
||
// http://gateway.starpos.com.cn/adpweb/ehpspos3/pubSigQry.json
|
||
$url = self::$gatewayUrl . "/pubSigQry.json";
|
||
$arrData['orgNo'] = self::$OrgNo; //机构号 self::$OrgNo
|
||
$arrData['mercId'] = self::$mercId; //商户号 self::$mercId
|
||
$arrData['trmNo'] = self::$trmNo; //设备号 self::$trmNo
|
||
$arrData['txnTime'] = date('YmdHis'); //设备端交易时间
|
||
$arrData['signType'] = 'MD5'; //签名方式
|
||
$arrData['version'] = 'V1.0.0'; //版本号
|
||
$arrData['signValue'] = $this->getSign($arrData);
|
||
$itemJson = json_encode($arrData);
|
||
$request = $this->http_request($url, $itemJson);
|
||
$request = urldecode($request);
|
||
$request = json_decode($request, true);
|
||
if ($request['returnCode'] == "000000") {
|
||
return true;
|
||
} else {
|
||
$this->errCode = $request['returnCode'];
|
||
return false;
|
||
}
|
||
}
|
||
|
||
//订单查询
|
||
public function QryBarcode($qryNo, $merchant_id, $time)
|
||
{
|
||
$url = self::$gatewayUrl . "/sdkQryBarcodePay.json";
|
||
$Qryarr = $this->execute($qryNo, $merchant_id);
|
||
$Qryarr['qryNo'] = $qryNo;
|
||
$Qryarr['txnTime'] = date('Ymd', $time);
|
||
$Qryarr['signValue'] = $this->getSign($Qryarr);
|
||
$Qryarr['qryDt'] = date('Ymd', $time);
|
||
$itemJson = json_encode($Qryarr);
|
||
$re = $this->http_request($url, $itemJson);
|
||
$request = urldecode($re);
|
||
$request = json_decode($request, true);
|
||
return $request;
|
||
}
|
||
|
||
/** 接口数字签名方法
|
||
* @param $data
|
||
* @return mixed
|
||
*/
|
||
private function getSign($data)
|
||
{
|
||
$key = self::$Key;
|
||
$arr = array_change_key_case($data, CASE_LOWER);
|
||
ksort($arr);
|
||
$str = "";
|
||
foreach ($arr as $val) {
|
||
$str .= $val;
|
||
}
|
||
$str .= $key;
|
||
return MD5($str);
|
||
}
|
||
|
||
/**
|
||
* @param $url 接口请求方法
|
||
* @param null $postFields
|
||
* @return mixed
|
||
*/
|
||
public function http_request($url, $data)
|
||
{
|
||
$ch = curl_init(); //用curl发送数据给api
|
||
$header = array(
|
||
'content-type:application/json;charset=GBK'
|
||
);
|
||
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
|
||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||
curl_setopt($ch, CURLOPT_URL, $url);
|
||
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
|
||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
|
||
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
|
||
$response = curl_exec($ch);
|
||
if ($response === FALSE) {
|
||
echo "CURL Error:" . curl_error($ch);
|
||
}
|
||
curl_close($ch);
|
||
return $response;
|
||
}
|
||
|
||
/**
|
||
* 新大陆回调
|
||
*/
|
||
public function notify()
|
||
{
|
||
$json_data = file_get_contents("php://input");
|
||
file_put_contents('./1.txt', date('Y-m-d H:i:s') . ': post1:' . $json_data . "\r\n", FILE_APPEND);
|
||
$config = M('continent_config')->find();
|
||
if ($config) {
|
||
$key = $config['continent_callback_secret_key'];
|
||
$privateKey = file_get_contents($config['continent_credential']);
|
||
$postData = json_decode($json_data, true);
|
||
if (strtoupper(md5($postData['Datas'] . $key)) == $postData['signValue']) {
|
||
$encode_data_arr = str_split($postData['Datas'], 256);
|
||
$decode_data_all = '';
|
||
foreach ($encode_data_arr as $value) {
|
||
openssl_private_decrypt(hex2bin($value), $decode_data, $privateKey);
|
||
$decode_data_all .= $decode_data;
|
||
}
|
||
$endData = json_decode($decode_data_all, true);
|
||
$data = var_export($endData, TRUE);
|
||
file_put_contents('./1.txt', 'post2:' . $data . "\r\n", FILE_APPEND);
|
||
if ($endData['TxnStatus'] == 1 && ($endData['PayChannel'] == 2 || $endData['PayChannel'] == 1) && ($endData['TxnCode'] == 'N007' || $endData['TxnCode'] == 'N002')) {
|
||
$PayOrderModel = D('RetailPayOrder');
|
||
if ($endData['TxnCode'] == 'N007') {
|
||
$Order = $PayOrderModel->getFind(array('out_trade_no' => strval($endData['ChannelId'])));
|
||
} else {
|
||
$Order = $PayOrderModel->getFind(array('out_trade_no' => strval($endData['TxnLogId'])));
|
||
}
|
||
file_put_contents('./1.txt', 'Order:' . json_encode($Order) . "\r\n", FILE_APPEND);
|
||
if (!empty($Order)) {
|
||
if ($Order['order_state'] == 'WAIT_BUYER_PAY') {
|
||
/*
|
||
* 1.新版回调,须在pay_order表存入回调地址
|
||
* 2.在调用该函数时请务必判断下列常量IsPayToUpdateOrder是否为YES
|
||
* 3.再进行更新订单操作
|
||
* */
|
||
if (!empty($Order[$PayOrderModel::NOTIFY_URL])) {
|
||
define('IsPayToUpdateOrder', 'YES');//存入常量
|
||
$updateData = array(
|
||
$PayOrderModel::ORDER_STATE => 'SUCCESS',
|
||
$PayOrderModel::EXTEND_CONTENT => json_encode($endData),
|
||
$PayOrderModel::TRADE_DATE => time(),
|
||
$PayOrderModel::TRADE_NO => $endData['OfficeId']
|
||
);
|
||
file_put_contents('./122.txt', 'Order22:' . json_encode($Order) . "\r\n", FILE_APPEND);
|
||
$PayOrderModel->updateOrder(array($PayOrderModel::ID => $Order[$PayOrderModel::ID]), $updateData); //更新pay_order表
|
||
$this->doAddRate($endData['OfficeId'], $Order, 3); //增加代理商合伙人分润记录
|
||
R($Order[$PayOrderModel::NOTIFY_URL], array($Order));//执行回调函数
|
||
} else {
|
||
if ($Order['order_type'] == 1) {
|
||
//买单
|
||
if ($endData['TxnCode'] == 'N007') {
|
||
$bill = D('Bill')->getFind(array('out_trade_no' => strval($endData['ChannelId']), 'pay_orderid' => $Order['id']));
|
||
} else {
|
||
$bill = D('Bill')->getFind(array('out_trade_no' => strval($endData['TxnLogId']), 'pay_orderid' => $Order['id']));
|
||
}
|
||
if (!empty($bill)) {
|
||
$updateData = array(
|
||
$PayOrderModel::ORDER_STATE => 'SUCCESS',
|
||
$PayOrderModel::EXTEND_CONTENT => json_encode($endData),
|
||
$PayOrderModel::TRADE_DATE => time(),
|
||
$PayOrderModel::TRADE_NO => $endData['OfficeId'],
|
||
$PayOrderModel::PAY_TYPE => 4
|
||
);
|
||
$PayOrderModel->updateOrder(array($PayOrderModel::ID => $Order[$PayOrderModel::ID]), $updateData); //更新pay_order表
|
||
A('Xcxapi/WxPay')->updateOrder_v1($bill);
|
||
$this->doAddRate($endData['OfficeId'], $Order, 3);
|
||
}
|
||
} else if ($Order['order_type'] == 2) {
|
||
//充值
|
||
$updateData = array(
|
||
$PayOrderModel::ORDER_STATE => 'SUCCESS',
|
||
$PayOrderModel::EXTEND_CONTENT => json_encode($endData),
|
||
$PayOrderModel::TRADE_DATE => time(),
|
||
$PayOrderModel::TRADE_NO => $endData['OfficeId']
|
||
);
|
||
$PayOrderModel->updateOrder(array($PayOrderModel::ID => $Order[$PayOrderModel::ID]), $updateData); //更新pay_order表
|
||
A('VipPay')->rechargeSuccess($Order, $updateData);
|
||
$this->doAddRate($endData['OfficeId'], $Order, 3);
|
||
} else if ($Order['order_type'] == 4) {
|
||
//礼品卡
|
||
$gift_order = M('gift_card_record')->where(array('pay_order_id' => $Order['id'], 'xcx_vid' => $Order['uid']))->find();
|
||
if (!empty($gift_order)) {
|
||
$update = M('gift_card_record')->where(array('id' => $gift_order['id']))->save(array('state' => 1));
|
||
$update1 = M('gift_card_price')->where(array('id' => $gift_order['gift_price_id']))->setDec('less_num', 1);
|
||
if ($update) {
|
||
$update['order_state'] = "SUCCESS";
|
||
$update['extend_content'] = json_encode($endData);
|
||
$update['trade_date'] = time();
|
||
$update['pay_type'] = 4;
|
||
$update['trade_no'] = $endData['OfficeId'];
|
||
M('retail_pay_order')->where(array('id' => $Order['id']))->save($update);
|
||
}
|
||
$this->doAddRate($endData['OfficeId'], $Order, 3);
|
||
}
|
||
} else if ($Order['order_type'] == 5) {
|
||
//开通续费plus会员
|
||
$up['order_state'] = "SUCCESS";
|
||
$up['extend_content'] = json_encode($endData);
|
||
$up['trade_date'] = time();
|
||
$up['pay_type'] = 4;
|
||
$up['trade_no'] = $endData['OfficeId'];
|
||
A('Xcxapi/PlusVip')->updateOrder($Order, $up);
|
||
$this->doAddRate($endData['OfficeId'], $Order, 3);
|
||
} else if ($Order['order_type'] == 6) {
|
||
//小助手快捷收单
|
||
$updateData = array(
|
||
$PayOrderModel::ORDER_STATE => 'SUCCESS',
|
||
$PayOrderModel::EXTEND_CONTENT => json_encode($endData),
|
||
$PayOrderModel::TRADE_DATE => time(),
|
||
$PayOrderModel::TRADE_NO => $endData['OfficeId']
|
||
);
|
||
file_put_contents('./122.txt', 'Order22:' . json_encode($Order) . "\r\n", FILE_APPEND);
|
||
$PayOrderModel->updateOrder(array($PayOrderModel::ID => $Order[$PayOrderModel::ID]), $updateData); //更新pay_order表
|
||
$this->doAddRate($endData['OfficeId'], $Order, 3); //增加代理商合伙人分润记录
|
||
}
|
||
}
|
||
}
|
||
return 'success';
|
||
} else {
|
||
//多域名回调
|
||
$continentNotify = file_get_contents('./Public/continent/notifyUrl.json');
|
||
if (!empty($continentNotify)) {
|
||
try {
|
||
$notifyList = json_decode($continentNotify, true);
|
||
if (is_array($notifyList)) {
|
||
foreach ($notifyList as $value) {
|
||
if (!empty($value['url'])) {
|
||
file_put_contents('./1.txt', date('Y-m-d H:i:s') . ' url: ' . $value['url'] . "\r\n", FILE_APPEND);
|
||
$res = $this->http_request($value['url'], $json_data);
|
||
file_put_contents('./1.txt', date('Y-m-d H:i:s') . ' res: ' . json_encode($res) . "\r\n", FILE_APPEND);
|
||
if ($res) {
|
||
return 'success';
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} catch (Exception $e) {
|
||
return false;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/*-------------------------2019-5-18 组合支付结束---------------------------------*/
|
||
|
||
/*-------------------------2019-7-8 新版支付开始---------------------------------*/
|
||
/**
|
||
* 新大陆刷卡支付
|
||
* @param $pay_order
|
||
* @param $subject
|
||
* @return mixed
|
||
*/
|
||
public function toContinentPay_v3($pay_order, $subject)
|
||
{
|
||
$url = self::$gatewayUrl . "/sdkBarcodePay.json";
|
||
$PayOrderModel = D('RetailPayOrder');
|
||
$itemData = $this->execute($pay_order[$PayOrderModel::OUT_TRADE_NO], $pay_order[$PayOrderModel::MERCHANT_ID], 1);
|
||
$itemData['authCode'] = $pay_order[$PayOrderModel::CODE]; //设备读取用户微信或支付宝中的条码或者二维码信息
|
||
$itemData['payChannel'] = $pay_order[$PayOrderModel::PAY_TYPE] == 2 ? 'ALIPAY' : 'WXPAY'; //支付宝---ALIPAY 微信---WXPAY 银联---YLPAY
|
||
$itemData['subject'] = $subject; //订单标题
|
||
$itemData['amount'] = $pay_order[$PayOrderModel::TRADE_AMOUNT] * 100; //实付金额 以分为单位
|
||
$itemData['total_amount'] = $itemData['amount']; //订单总金额
|
||
//拼接之后签名
|
||
$itemData['signValue'] = $this->getSign($itemData);
|
||
$itemJson = json_encode($itemData);
|
||
$re = $this->http_request($url, $itemJson);
|
||
$request = urldecode($re);
|
||
file_put_contents('./xdlLinePay.txt', date('Y-m-d H:i:s') . json_encode($request), FILE_APPEND);
|
||
$request = json_decode($request, true);
|
||
if ($request['returnCode'] == "000000") {
|
||
if ($request['result'] == "A") {
|
||
$result = $this->searchAndUpdateOrder_v3($pay_order);
|
||
} else if ($request['result'] == "S") {
|
||
//支付成功
|
||
$save[$PayOrderModel::TRADE_NO] = $request['orderNo'];
|
||
$save[$PayOrderModel::ORDER_STATE] = 'SUCCESS';
|
||
$save[$PayOrderModel::TRADE_DATE] = time();
|
||
$save[$PayOrderModel::EXTEND_CONTENT] = json_encode($request);
|
||
$up = $PayOrderModel->updateOrder(array($PayOrderModel::ID => $pay_order[$PayOrderModel::ID]), $save);
|
||
$this->doAddRate($request['orderNo'], $pay_order, 3);//分润
|
||
if ($up) {
|
||
$result['status'] = 1;
|
||
$result['msg'] = '支付成功';
|
||
} else {
|
||
$result['status'] = 0;
|
||
$result['msg'] = '支付成功但订单更新失败1,请联系管理员';
|
||
}
|
||
}
|
||
} else {
|
||
$result['request'] = $request;
|
||
$result['post'] = $itemData;
|
||
$result['status'] = 0;
|
||
$result['msg'] = $request['message'] ? $request['message'] : '支付失败';
|
||
}
|
||
return $result;
|
||
}
|
||
|
||
/**
|
||
* 用户等待支付
|
||
* @param $pay_order
|
||
* @return mixed
|
||
*/
|
||
public function searchAndUpdateOrder_v3($pay_order)
|
||
{
|
||
$canReturn = false;
|
||
$PayOrderModel = D('RetailPayOrder');
|
||
while (!$canReturn) {
|
||
$res = $this->QryBarcode($pay_order['out_trade_no'], $pay_order['merchant_id'], $pay_order['add_time']);
|
||
file_put_contents('./xdlLinePay.txt', date('Y-m-d H:i:s') . json_encode($res), FILE_APPEND);
|
||
if ($res['returnCode'] == '000000') {
|
||
if ($res['result'] == 'A') {
|
||
$time = get_runtime();
|
||
if ($time >= 60) {
|
||
//超时,撤销订单
|
||
$result['status'] = 0;
|
||
$result['msg'] = '用户取消支付';
|
||
$canReturn = true;
|
||
}
|
||
} else if ($res['result'] == 'S') {
|
||
//支付成功
|
||
$save[$PayOrderModel::TRADE_NO] = $res['orderNo'];
|
||
$save[$PayOrderModel::ORDER_STATE] = 'SUCCESS';
|
||
$save[$PayOrderModel::TRADE_DATE] = time();
|
||
$save[$PayOrderModel::EXTEND_CONTENT] = json_encode($res);
|
||
$up = $PayOrderModel->updateOrder(array($PayOrderModel::ID => $pay_order[$PayOrderModel::ID]), $save);
|
||
$this->doAddRate($res['orderNo'], $pay_order, 3);
|
||
if ($up) {
|
||
$result['status'] = 1;
|
||
$result['msg'] = '支付成功';
|
||
} else {
|
||
$result['status'] = 0;
|
||
$result['msg'] = '支付成功但订单更新失败2,请联系管理员';
|
||
}
|
||
$canReturn = true;
|
||
} else {
|
||
$result['status'] = 0;
|
||
$result['msg'] = '用户取消支付2';
|
||
$canReturn = true;
|
||
}
|
||
} else {
|
||
$result['status'] = 0;
|
||
$result['res'] = $res;
|
||
$result['msg'] = '用户取消支付3';
|
||
$canReturn = true;
|
||
}
|
||
}
|
||
return $result;
|
||
}
|
||
|
||
/**
|
||
* 2019-7-9 小程序下单接口
|
||
* @param $total_fee
|
||
* @param $openid
|
||
* @param $merchant_id
|
||
* @param $out_trade_no
|
||
* @return mixed
|
||
*/
|
||
public function pubSigPay_v3($total_fee, $openid, $merchant_id, $out_trade_no)
|
||
{
|
||
$res = $this->pubSigQrys($merchant_id);
|
||
if ($res) {
|
||
$appId = M('merchant_infos')->where(array('merchant_id' => $merchant_id))->getField('xcc_appid');
|
||
$url = self::$gatewayUrl . "/pubSigPay.json";
|
||
$this->orN($merchant_id);
|
||
$param['orgNo'] = self::$OrgNo; //机构号
|
||
$param['mercId'] = self::$mercId; //商户号
|
||
$param['trmNo'] = self::$trmNo; //终端号
|
||
$param['txnTime'] = date('YmdHis'); //设备端交易时间
|
||
$param['version'] = 'V1.0.0';
|
||
$param['amount'] = $total_fee;
|
||
$param['total_amount'] = $total_fee;
|
||
$param['openid'] = $openid;
|
||
$param['txnappid'] = $appId;
|
||
$param['selOrderNo'] = $out_trade_no;//商户内部订单号
|
||
//拼接之后签名
|
||
$itemJson = json_encode($param);
|
||
$re = $this->http_request($url, $itemJson);
|
||
$request = urldecode($re);
|
||
$request = json_decode($request, true);
|
||
if ($request['returnCode'] == '000000') {
|
||
$data['timeStamp'] = $request['apiTimestamp'];
|
||
$data['nonceStr'] = $request['apiNoncestr'];
|
||
$data['package'] = $request['apiPackage'];
|
||
$data['signType'] = $request['apiSigntype'];
|
||
$data['paySign'] = $request['apiPaysign'];
|
||
$data['PrepayId'] = $request['PrepayId'];
|
||
|
||
$result['status'] = 1;
|
||
$result['msg'] = '创建订单成功';
|
||
$result['data'] = $data;
|
||
} else {
|
||
$result['status'] = 0;
|
||
$result['msg'] = $request['message'] ? $request['message'] : '创建订单失败';
|
||
}
|
||
} else {
|
||
$result['status'] = 0;
|
||
$result['msg'] = '新大陆支付初始化失败';
|
||
}
|
||
return $result;
|
||
}
|
||
|
||
/**
|
||
* 退款
|
||
* @param $payOrder
|
||
* @return mixed
|
||
*/
|
||
public function toOrderRefund_v3($payOrder)
|
||
{
|
||
$url = self::$gatewayUrl . "/sdkRefundBarcodePay.json";
|
||
$PayOrderModel = D('RetailPayOrder');
|
||
$txnArr = $this->execute($payOrder[$PayOrderModel::TRADE_NO], $payOrder[$PayOrderModel::MERCHANT_ID]);
|
||
$txnArr['orderNo'] = $payOrder[$PayOrderModel::TRADE_NO]; //支付渠道订单号
|
||
$txnArr['tradeNo'] = $payOrder[$PayOrderModel::OUT_TRADE_NO];
|
||
$txnArr['txnAmt'] = $payOrder[$PayOrderModel::TRADE_AMOUNT] * 100; //退款金额
|
||
$txnArr['signValue'] = $this->getSign($txnArr);
|
||
$itemJson = json_encode($txnArr);
|
||
$re = $this->http_request($url, $itemJson);
|
||
$request = urldecode($re);
|
||
$request = json_decode($request, true);
|
||
|
||
// file_put_contents('1.txt', json_encode($request) . "\r\n", FILE_APPEND);
|
||
$result['data'] = $request;
|
||
if ($request['returnCode'] == "000000") {
|
||
$where['out_trade_no'] = $payOrder['before_trade_no'];
|
||
$where['state'] = 0;
|
||
$info = M('continent_cash')->where($where)->find();
|
||
if (!empty($info)) {
|
||
$refundMoney = $payOrder[$PayOrderModel::TRADE_AMOUNT];
|
||
if ((floatval($refundMoney) < round($info['trade_amount'] + $info['refund_amount'], 2))) {
|
||
$partner_refund_profit = round(($info['agent_rate'] - $info['partner_rate']) / 100 * $refundMoney, 2);
|
||
$agent_refund_profit = round(($info['merchant_rate'] - $info['agent_rate']) / 100 * $refundMoney, 2);
|
||
} else {
|
||
$partner_refund_profit = $info['partner_profit'];
|
||
$agent_refund_profit = $info['agent_profit'];
|
||
}
|
||
$save['partner_refund_profit'] = round($info['partner_refund_profit'] + $partner_refund_profit, 2);
|
||
$save['agent_refund_profit'] = round($info['agent_refund_profit'] + $agent_refund_profit, 2);
|
||
if ($save['partner_refund_profit'] > $info['partner_profit']) {
|
||
$partner_refund_profit = round($info['partner_profit'] - $info['partner_refund_profit'], 2);
|
||
$save['partner_refund_profit'] = $info['partner_profit'];
|
||
}
|
||
if ($agent_refund_profit > $info['agent_profit']) {
|
||
$agent_refund_profit = round($info['agent_profit'] - $info['agent_refund_profit'], 2);
|
||
$save['agent_refund_profit'] = $info['agent_profit'];
|
||
}
|
||
$save['refund_amount'] = round($refundMoney + $info['refund_amount'], 2);
|
||
M('retail_admin')->where(array('id' => $info['partner_id']))->setDec('balance', $agent_refund_profit);
|
||
M('retail_agent')->where(array('id' => $info['agent_id']))->setDec('balance', $partner_refund_profit);
|
||
M('continent_cash')->where($where)->save($save);
|
||
}
|
||
$result['status'] = 1;
|
||
$result['msg'] = '退款成功';
|
||
} else {
|
||
$result['status'] = 0;
|
||
$result['msg'] = '退款失败';
|
||
}
|
||
return $result;
|
||
}
|
||
|
||
/**
|
||
* 新大陆扫码支付获取二维码
|
||
* @param array $order pay_order订单
|
||
* @return array $res
|
||
*/
|
||
public function sweepCodePay($order)
|
||
{
|
||
$RPOModel = D('RetailPayOrder'); // pay_order表模型
|
||
$money = $order[$RPOModel::TRADE_AMOUNT] * 100;
|
||
$url = self::$gatewayUrl . "/sdkBarcodePosPay.json";
|
||
$mer_id = M("merchant_infos")->where(array('merchant_id' => $order['merchant_id']))->getField("merc_id");
|
||
$RPOModel->updateOrder(array($RPOModel::OUT_TRADE_NO => $order[$RPOModel::OUT_TRADE_NO]), array($RPOModel::MER_ID => $mer_id));
|
||
$arrData = $this->execute($order[$RPOModel::OUT_TRADE_NO], $order[$RPOModel::MERCHANT_ID]);
|
||
$arrData['amount'] = $money; // $param['money']*100
|
||
$arrData['total_amount'] = $money; // $param['total_amount']
|
||
$arrData['payChannel'] = $order[$RPOModel::PAY_TYPE] == 2 ? 'ALIPAY' : 'WXPAY'; //$param['types']
|
||
$arrData['signValue'] = $this->getSign($arrData);
|
||
$itemJson = json_encode($arrData);
|
||
$re = $this->http_request($url, $itemJson);
|
||
$request = urldecode($re);
|
||
$request = json_decode($request, true);
|
||
if ($request['returnCode'] == '000000') {
|
||
if ($request['result'] == 'S') {
|
||
$data['code_url'] = $request['payCode'];
|
||
$res['qr_code'] = $request['payCode'];
|
||
$res['data'] = $data;
|
||
$res['status'] = 1;
|
||
} else {
|
||
$res['status'] = 0;
|
||
$res['msg'] = $request['message'];
|
||
}
|
||
} else {
|
||
$res['status'] = 0;
|
||
$res['msg'] = $request['message'];
|
||
}
|
||
return $res;
|
||
}
|
||
/*-------------------------2019-7-8 新版支付结束---------------------------------*/
|
||
|
||
/**
|
||
* 2019-11-15 小程序或公众号下单接口
|
||
* @param $payOrder
|
||
* @param $openid
|
||
* @param $type 1公众号 2小程序
|
||
* @return mixed
|
||
*/
|
||
public function createOnlineOrder($payOrder, $openid, $type)
|
||
{
|
||
$PayOrderModel = D('RetailPayOrder');
|
||
$merchant_id = $payOrder[$PayOrderModel::MERCHANT_ID];
|
||
$total_fee = $payOrder[$PayOrderModel::TRADE_AMOUNT] * 100;
|
||
$out_trade_no = $payOrder[$PayOrderModel::OUT_TRADE_NO];
|
||
$res = $this->pubSigQrys($merchant_id);
|
||
if ($res) {
|
||
$iMap = array(
|
||
'merchant_id' => $merchant_id,
|
||
);
|
||
$infos = M('merchant_infos')->where($iMap)->field('xcc_appid,merc_id,wx_appid')->find();
|
||
$appId = $type == 1 ? $infos['wx_appid'] : $infos['xcc_appid'];
|
||
$pMap = array(
|
||
$PayOrderModel::ID => $payOrder[$PayOrderModel::ID],
|
||
);
|
||
$pSave = array(
|
||
$PayOrderModel::MER_ID => $infos['merc_id'],
|
||
$PayOrderModel::M_PAY_TYPE => 3,
|
||
);
|
||
$PayOrderModel->updateOrder($pMap, $pSave);//更新支付收款商户号
|
||
|
||
$url = self::$gatewayUrl . "/pubSigPay.json";
|
||
$this->orN($merchant_id);
|
||
$param['orgNo'] = self::$OrgNo; //机构号
|
||
$param['mercId'] = self::$mercId; //商户号
|
||
$param['trmNo'] = self::$trmNo; //终端号
|
||
$param['txnTime'] = date('YmdHis'); //设备端交易时间
|
||
$param['version'] = 'V1.0.0';
|
||
$param['amount'] = $total_fee;
|
||
$param['total_amount'] = $total_fee;
|
||
$param['openid'] = $openid;
|
||
$param['txnappid'] = $appId;
|
||
$param['selOrderNo'] = $out_trade_no;//商户内部订单号
|
||
//拼接之后签名
|
||
$itemJson = json_encode($param);
|
||
$re = $this->http_request($url, $itemJson);
|
||
$request = urldecode($re);
|
||
$request = json_decode($request, true);
|
||
if ($request['returnCode'] == '000000') {
|
||
$data['timeStamp'] = $request['apiTimestamp'];
|
||
$data['nonceStr'] = $request['apiNoncestr'];
|
||
$data['package'] = $request['apiPackage'];
|
||
$data['signType'] = $request['apiSigntype'];
|
||
$data['paySign'] = $request['apiPaysign'];
|
||
$data['PrepayId'] = $request['PrepayId'];
|
||
$data['signType'] = $request['apiSigntype'];
|
||
|
||
$result['status'] = 1;
|
||
$result['msg'] = '创建订单成功';
|
||
$result['data'] = $data;
|
||
} else {
|
||
$result['status'] = 0;
|
||
$result['msg'] = $request['message'] ? $request['message'] : '创建订单失败';
|
||
}
|
||
} else {
|
||
$result['status'] = 0;
|
||
$result['msg'] = '新大陆支付初始化失败';
|
||
}
|
||
return $result;
|
||
}
|
||
|
||
/**
|
||
* 新大陆刷卡支付 2020-10-15
|
||
* @param $pay_order
|
||
* @param $subject
|
||
* @return mixed
|
||
*/
|
||
public function toContinentPay_v4($pay_order, $subject)
|
||
{
|
||
$url = self::$gatewayUrl . "/sdkBarcodePay.json";
|
||
|
||
$this->orN($pay_order['merchant_id']);
|
||
$itemData = [
|
||
'opSys' => 0, //操作系统
|
||
'characterSet' => '00',
|
||
'orgNo' => self::$OrgNo,
|
||
'mercId' => self::$mercId, //商户号 $param['mercId']
|
||
'version' => 'V1.0.6', //版本号
|
||
'trmNo' => self::$trmNo, //设备号 $param['trmNo']
|
||
'tradeNo' => $pay_order['out_trade_no'], //商户端订单号 $param['tradeNO']
|
||
'txnTime' => date('YmdHis'), //设备端交易时间 时间戳格式$ param['txnTime']
|
||
'signType' => 'MD5', //签名方式
|
||
|
||
'authCode' => $pay_order['code'], //设备读取用户微信或支付宝中的条码或者二维码信息
|
||
'payChannel' => $pay_order['pay_type'] == 2 ? 'ALIPAY' : 'WXPAY', //支付宝---ALIPAY 微信---WXPAY 银联---YLPAY
|
||
'subject' => $subject, //订单标题
|
||
'amount' => $pay_order['trade_amount'] * 100, //实付金额 以分为单位
|
||
'total_amount' => $pay_order['trade_amount'] * 100, //订单总金额
|
||
'orderTimOut' => '1',//订单超时时间(单位:分)仅V1.0.6往上的版本支持
|
||
];
|
||
|
||
//拼接之后签名
|
||
$itemData['signValue'] = $this->getSign($itemData);
|
||
$itemJson = json_encode($itemData);
|
||
$request = $this->http_request($url, $itemJson);
|
||
$request = urldecode($request);
|
||
file_put_contents('./xdlLinePay.txt', date('Y-m-d H:i:s') . json_encode($request), FILE_APPEND);
|
||
$request = json_decode($request, true);
|
||
if ($request['returnCode'] == "000000") {
|
||
return callBack(statusCode()['success'],"请求成功");
|
||
} else {
|
||
$result['request'] = $request;
|
||
$result['post'] = $itemData;
|
||
$result['status'] = 0;
|
||
$result['message'] = $request['message'] ? $request['message'] : '支付失败';
|
||
return $result;
|
||
}
|
||
}
|
||
}
|