|
@@ -4,32 +4,40 @@ namespace rbridge\gy;
|
|
|
|
|
|
require_once(BASE_HELPER_PATH . '/rbridge/gy/config.php');
|
|
|
|
|
|
-use rbridge\BridgeTrait;
|
|
|
use rbridge\IBridge;
|
|
|
use rbridge\IBridgeEx;
|
|
|
+use rbridge\BridgeTrait;
|
|
|
use refill;
|
|
|
use Log;
|
|
|
-use StatesHelper;
|
|
|
+use SimpleXMLElement;
|
|
|
+use member_info;
|
|
|
|
|
|
class Bridge implements IBridge, IBridgeEx
|
|
|
{
|
|
|
use BridgeTrait;
|
|
|
+
|
|
|
public function add($params)
|
|
|
{
|
|
|
+ $input_names = ['userid', 'request_id', 'telephone', 'money', 'callbackurl'];
|
|
|
+ $out_names = ['order_id', 'request_id', 'telephone', 'money', 'result'];
|
|
|
+
|
|
|
$mchid = config::mchid($params);
|
|
|
- if($mchid === false) {
|
|
|
- return [false, "机构不存在"];
|
|
|
+ if ($mchid === false) {
|
|
|
+ $params['result'] = 4; //请求参数不完整或不合法
|
|
|
+ return [false, $this->result_format($params, $out_names, '')];
|
|
|
}
|
|
|
|
|
|
$mchinfo = Model('merchant')->getMerchantInfo(['mchid' => $mchid]);
|
|
|
- if(empty($mchinfo)) {
|
|
|
- return [false, "机构{$mchid}不存在"];
|
|
|
+ if (empty($mchinfo)) {
|
|
|
+ $params['result'] = 6; //代理商不存在
|
|
|
+ return [false, $this->result_format($params, $out_names, '')];
|
|
|
}
|
|
|
|
|
|
- $names = ['userid','request_id','telephone','money','callbackurl'];
|
|
|
- [$succ, $errmsg] = $this->check($mchinfo, $params, $names);
|
|
|
- if(!$succ) {
|
|
|
- return [$succ,$errmsg];
|
|
|
+ $secure_key = $mchinfo['secure_key'];
|
|
|
+ [$succ, $result] = $this->check($mchinfo, $params, $input_names);
|
|
|
+ if (!$succ) {
|
|
|
+ $params['result'] = $result;
|
|
|
+ return [false, $this->result_format($params, $out_names, $secure_key)];
|
|
|
}
|
|
|
|
|
|
Model('merchant_query')->add_info($mchid, $params['request_id'], json_encode($params));
|
|
@@ -37,7 +45,7 @@ class Bridge implements IBridge, IBridgeEx
|
|
|
$order_time = time();
|
|
|
$mch_order = $params['request_id'];
|
|
|
$card_no = $params['telephone'];
|
|
|
- $input = [ 'mchid' => $mchid,
|
|
|
+ $input = ['mchid' => $mchid,
|
|
|
'buyer_id' => intval($mchinfo['admin_id']),
|
|
|
'amount' => $params['money'],
|
|
|
'card_no' => $card_no,
|
|
@@ -46,25 +54,58 @@ class Bridge implements IBridge, IBridgeEx
|
|
|
'order_time' => $order_time
|
|
|
];
|
|
|
|
|
|
- refill\util::push_queue_order($mchid,$mch_order,ORDER_STATE_QUEUE);
|
|
|
- Model('refill_order')->add_detail($mchid,$mch_order,$order_time,$params,ORDER_STATE_QUEUE);
|
|
|
+ refill\util::push_queue_order($mchid, $mch_order, ORDER_STATE_QUEUE);
|
|
|
+ $detail_id = Model('refill_order')->add_detail($mchid, $mch_order, $order_time, $params, ORDER_STATE_QUEUE);
|
|
|
|
|
|
$state = refill\util::push_add($input);
|
|
|
if ($state === true) {
|
|
|
- Log::record("gy::Bridge refill::util::push_add success mchid={$mchid} mch_order={$mch_order} state={$state}",Log::DEBUG);
|
|
|
- return [true, '提交成功'];
|
|
|
+ Log::record("gy::Bridge refill::util::push_add success mchid=$mchid mch_order=$mch_order state=true", Log::DEBUG);
|
|
|
+ $params['order_id'] = $detail_id;
|
|
|
+ $params['result'] = 2; //提交成功,正在充值(适用于异步接口)
|
|
|
+ return [true, $this->result_format($params, $out_names, $secure_key)];
|
|
|
} else {
|
|
|
- refill\util::del_queue_order($mchid,$mch_order);
|
|
|
- Model('refill_order')->del_detail($mchid,$mch_order);
|
|
|
- Log::record("gy::Bridge refill::util::push_add error mchid={$mchid} mch_order={$mch_order} state={$state}",Log::DEBUG);
|
|
|
- return [false, '提交失败'];
|
|
|
+ refill\util::del_queue_order($mchid, $mch_order);
|
|
|
+ Model('refill_order')->del_detail($mchid, $mch_order);
|
|
|
+ Log::record("gy::Bridge refill::util::push_add error mchid=$mchid mch_order=$mch_order state=$state", Log::DEBUG);
|
|
|
+
|
|
|
+ $params['result'] = 12; //未知错误
|
|
|
+ return [true, $this->result_format($params, $out_names, $secure_key)];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private function result_format($input, $names, $secure_key)
|
|
|
+ {
|
|
|
+ $result = $this->sign($input, $names, $secure_key);
|
|
|
+ $xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><root></root>');
|
|
|
+ config::arrayToXml($xml,$result);
|
|
|
+
|
|
|
+ return $xml->asXML();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private function sign($input, $names, $secure_key)
|
|
|
+ {
|
|
|
+ $result = [];
|
|
|
+
|
|
|
+ $body = '';
|
|
|
+ foreach ($names as $name) {
|
|
|
+ $val = $input[$name] ?? '';
|
|
|
+ $body .= $val;
|
|
|
+
|
|
|
+ $result[$name] = $val;
|
|
|
+ }
|
|
|
+ $body .= $secure_key;
|
|
|
+
|
|
|
+ $sign = strtoupper(md5($body));
|
|
|
+ $result['sign'] = $sign;
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
private function check($mchinfo, $input, $names): array
|
|
|
{
|
|
|
if ($mchinfo['merchant_state'] != 1) {
|
|
|
- return [false,"机构已被关闭."];
|
|
|
+ return [false, 6]; //代理商不存在
|
|
|
}
|
|
|
|
|
|
$ips = unserialize($mchinfo['ip_white_list']);
|
|
@@ -73,30 +114,25 @@ class Bridge implements IBridge, IBridgeEx
|
|
|
$addr = $_SERVER['REMOTE_ADDR'];
|
|
|
if(!in_array($addr,$ips)) {
|
|
|
Log::record("request ip:$addr", Log::DEBUG);
|
|
|
- return [false,"请求地址不在白名单中."];
|
|
|
+ return [false, 12]; //未知错误
|
|
|
}
|
|
|
}
|
|
|
|
|
|
$usekey = intval($mchinfo['use_key']);
|
|
|
$key = $mchinfo['secure_key'];
|
|
|
|
|
|
- if($usekey)
|
|
|
- {
|
|
|
+ if ($usekey) {
|
|
|
$ret = $this->verify($input, $names, $key);
|
|
|
- if(!$ret) {
|
|
|
- return [false,'签名认证失败.'];
|
|
|
+ if (!$ret) {
|
|
|
+ return [false, 5]; //签名错误
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return [true,''];
|
|
|
+ return [true, ''];
|
|
|
}
|
|
|
|
|
|
private function verify($params, $names, $key)
|
|
|
{
|
|
|
- $orgSign = $params['sign'];
|
|
|
- unset($params['sign']);
|
|
|
- ksort($params);
|
|
|
-
|
|
|
$body = '';
|
|
|
foreach ($names as $name) {
|
|
|
$val = $params[$name] ?? '';
|
|
@@ -105,93 +141,144 @@ class Bridge implements IBridge, IBridgeEx
|
|
|
$body .= $key;
|
|
|
|
|
|
$sign = strtoupper(md5($body));
|
|
|
- return $orgSign == $sign;
|
|
|
+ return $params['sign'] == $sign;
|
|
|
}
|
|
|
|
|
|
public function query($params)
|
|
|
{
|
|
|
+ $input_names = ['userid', 'request_id'];
|
|
|
+ $out_names = ['order_id', 'request_id', 'telephone', 'money', 'result'];
|
|
|
+
|
|
|
$mchid = config::mchid($params);
|
|
|
- if($mchid === false) {
|
|
|
- return [false, "机构不存在"];
|
|
|
+ $mch_order = $params['request_id'];
|
|
|
+
|
|
|
+ if ($mchid === false or empty($mch_order)) {
|
|
|
+ $params['result'] = 4; //请求参数不完整或不合法
|
|
|
+ return [false, $this->result_format($params, $out_names, '')];
|
|
|
}
|
|
|
|
|
|
$mchinfo = Model('merchant')->getMerchantInfo(['mchid' => $mchid]);
|
|
|
- if(empty($mchinfo)) {
|
|
|
- return [false, "机构{$mchid}不存在"];
|
|
|
+ if (empty($mchinfo)) {
|
|
|
+ $params['result'] = 6; //代理商不存在
|
|
|
+ return [false, $this->result_format($params, $out_names, '')];
|
|
|
}
|
|
|
|
|
|
- $names = ['userid','request_id'];
|
|
|
- [$succ, $errmsg] = $this->check($mchinfo, $params, $names);
|
|
|
+ $secure_key = $mchinfo['secure_key'];
|
|
|
+ [$succ, $result] = $this->check($mchinfo, $params, $input_names);
|
|
|
if(!$succ) {
|
|
|
- return [$succ,$errmsg];
|
|
|
+ $params['result'] = $result;
|
|
|
+ return [$succ, $this->result_format($params, $out_names, $secure_key)];
|
|
|
}
|
|
|
|
|
|
- $mch_order = $params['request_id'];
|
|
|
- [$code,$result] = $this->order_query($mchid,$mch_order);
|
|
|
+ [$detail_id,$info] = $this->detail($mchid, $mch_order);
|
|
|
+ [$code, $order] = $this->order_query($mchid, $mch_order);
|
|
|
+
|
|
|
+ if ($code == 200) {
|
|
|
+ $info['order_id'] = $detail_id;
|
|
|
+ $order_state = $order['order_state'];
|
|
|
+ } else {
|
|
|
+ $order_state = ORDER_STATE_NOEXIST;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(in_array($order_state,[ORDER_STATE_QUEUE,ORDER_STATE_NEW,ORDER_STATE_PAY,ORDER_STATE_SEND])) {
|
|
|
+ $info['result'] = 2;
|
|
|
+ }
|
|
|
+ elseif($order_state == ORDER_STATE_SUCCESS) {
|
|
|
+ $info['result'] = 0;
|
|
|
+ }
|
|
|
+ elseif($order_state == ORDER_STATE_CANCEL) {
|
|
|
+ $info['result'] = 1;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ $info['result'] = 3;
|
|
|
+ }
|
|
|
+
|
|
|
+ return [true, $this->result_format($info, $out_names, $secure_key)];
|
|
|
+ }
|
|
|
+
|
|
|
+ private function detail($mchid, $mch_order)
|
|
|
+ {
|
|
|
+ $mod_refill = Model('refill_order');
|
|
|
+ $detail = $mod_refill->get_detail($mchid,$mch_order);
|
|
|
+ if(empty($detail)) {
|
|
|
+ return [false, []];
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return [intval($detail['detail_id']), json_decode($detail['params'], true)];
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public function balance($params)
|
|
|
{
|
|
|
+ $input_names = ['userid'];
|
|
|
+ $out_names = ['userid', 'money'];
|
|
|
+
|
|
|
+ $mchid = config::mchid($params);
|
|
|
+
|
|
|
+ if ($mchid === false) {
|
|
|
+ $params['result'] = 4; //请求参数不完整或不合法
|
|
|
+ return [false, $this->result_format($params, $out_names, '')];
|
|
|
+ }
|
|
|
+
|
|
|
+ $mchinfo = Model('merchant')->getMerchantInfo(['mchid' => $mchid]);
|
|
|
+ if (empty($mchinfo)) {
|
|
|
+ $params['result'] = 6; //代理商不存在
|
|
|
+ return [false, $this->result_format($params, $out_names, '')];
|
|
|
+ }
|
|
|
+
|
|
|
+ $secure_key = $mchinfo['secure_key'];
|
|
|
+ [$succ, $result] = $this->check($mchinfo, $params, $input_names);
|
|
|
+ if(!$succ) {
|
|
|
+ $params['result'] = $result;
|
|
|
+ return [$succ, $this->result_format($params, $out_names, $secure_key)];
|
|
|
+ }
|
|
|
+
|
|
|
+ $uid = intval($mchinfo['admin_id']);
|
|
|
+ $minfo = new member_info($uid);
|
|
|
+ $available = $minfo->available_predeposit();
|
|
|
+ $money = ncPriceFormat($available - $mchinfo['credit_bonus']);
|
|
|
+ $params['money'] = $money;
|
|
|
+
|
|
|
+ return [false, $this->result_format($params, $out_names, $secure_key)];
|
|
|
}
|
|
|
|
|
|
|
|
|
public function notify($params)
|
|
|
{
|
|
|
+ $out_names = ['order_id', 'request_id', 'telephone', 'money', 'result'];
|
|
|
+
|
|
|
$mchid = $params['mchid'];
|
|
|
- $mch_ordersn = $params['order_sn'];
|
|
|
- $body = $this->notify_body($params);
|
|
|
-
|
|
|
- $userID = config::USER_ID;
|
|
|
- $header = [
|
|
|
- 'Content-Type: application/json',
|
|
|
- "OrderNo: {$mch_ordersn}",
|
|
|
- "UserID: {$userID}",
|
|
|
- ];
|
|
|
+ $mch_order = $params['order_sn'];
|
|
|
+ [$detail_id,$input] = $this->detail($mchid, $mch_order);
|
|
|
+
|
|
|
+
|
|
|
+ $mchid = $params['mchid'];
|
|
|
+ $mchinfo = Model('merchant')->getMerchantInfo(['mchid' => $mchid]);
|
|
|
+ $secure_key = $mchinfo['secure_key'];
|
|
|
|
|
|
- $body = json_encode($body, JSON_UNESCAPED_UNICODE);
|
|
|
- $body = $this->aes_encrypt($body);
|
|
|
- $reqData['PostData'] = $body;
|
|
|
- $reqData = json_encode($reqData, JSON_UNESCAPED_UNICODE);
|
|
|
+ $body = $this->notify_body($detail_id,$input,$params['state']);
|
|
|
+ $body = $this->sign($body,$out_names,$secure_key);
|
|
|
|
|
|
- $resp = http_post_data(config::ORDER_COMPLETE_URL, $reqData, $header, $net_errno);
|
|
|
+ $resp = http_request($input['callbackurl'], $body, 'GET');
|
|
|
if (empty($resp)) {
|
|
|
- Log::record("回调下游,请求超时 mchid = {$mchid} mch_order = {$mch_ordersn}", Log::ERR);
|
|
|
+ Log::record("回调下游,请求超时 mchid = $mchid mch_order = $mch_order", Log::ERR);
|
|
|
+ return false;
|
|
|
+ } elseif (in_array($resp, ['success'])) {
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
return false;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- Log::record($resp, Log::DEBUG);
|
|
|
- $resp = json_decode($resp, true);
|
|
|
- if (empty($resp)) {
|
|
|
- Log::record("回调下游,返回数据格式有误 mchid = {$mchid} mch_order = {$mch_ordersn}", Log::ERR);
|
|
|
- return false;
|
|
|
- } elseif ($resp['code'] === '200' && $resp['data'] === true) {
|
|
|
- return true;
|
|
|
- } else {
|
|
|
- Log::record("回调下游,返回失败 mchid = {$mchid} mch_order = {$mch_ordersn} message = {$resp['message']}", Log::ERR);
|
|
|
- return false;
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private function notify_body($params)
|
|
|
+ private function notify_body($detail_id, $input, $order_state)
|
|
|
{
|
|
|
- $success = $params['state'] == 'SUCCESS';
|
|
|
- $body = [
|
|
|
- "OrderNo" => $params['order_sn'],
|
|
|
- "Status" => $success ? 1 : 2,
|
|
|
- "Description" => '',
|
|
|
- "RealCost" => "",
|
|
|
- "SubstituteAccount" => "",
|
|
|
- "ChannelAccountId" => "",
|
|
|
- "InventoryId" => "",
|
|
|
- "OperatorSerialNumber" => ""
|
|
|
- ];
|
|
|
-
|
|
|
- if($body['Status'] === 1) {
|
|
|
- $body['OperatorSerialNumber'] = $params['official_sn'];
|
|
|
+ $input['order_id'] = $detail_id;
|
|
|
+ if($order_state == 'SUCCESS') {
|
|
|
+ $input['result'] = 0;
|
|
|
+ } else {
|
|
|
+ $input['result'] = 1;
|
|
|
}
|
|
|
|
|
|
- return $body;
|
|
|
+ return $input;
|
|
|
}
|
|
|
}
|