Ver código fonte

add all channel to yl

stanley-king 3 anos atrás
pai
commit
699e6bbb27
100 arquivos alterados com 6022 adições e 0 exclusões
  1. 52 0
      helper/refill/api/yl/afand/RefillCallBack.php
  2. 110 0
      helper/refill/api/yl/afand/RefillPhone.php
  3. 20 0
      helper/refill/api/yl/afand/config.php
  4. 49 0
      helper/refill/api/yl/afandeng/RefillCallBack.php
  5. 100 0
      helper/refill/api/yl/afandeng/RefillPhone.php
  6. 13 0
      helper/refill/api/yl/afandeng/config.php
  7. 47 0
      helper/refill/api/yl/afandfs/RefillCallBack.php
  8. 108 0
      helper/refill/api/yl/afandfs/RefillPhone.php
  9. 20 0
      helper/refill/api/yl/afandfs/config.php
  10. 19 0
      helper/refill/api/yl/afandfs/北京分省账户.txt
  11. BIN
      helper/refill/api/yl/afandfs/阿凡灯分省对接文档.docx
  12. 73 0
      helper/refill/api/yl/afandnew/RefillCallBack.php
  13. 114 0
      helper/refill/api/yl/afandnew/RefillPhone.php
  14. 14 0
      helper/refill/api/yl/afandnew/afd007.txt
  15. 32 0
      helper/refill/api/yl/afandnew/config.php
  16. 628 0
      helper/refill/api/yl/afandnew/阿凡灯充值系统2.2.doc
  17. 50 0
      helper/refill/api/yl/afd/RefillCallBack.php
  18. 110 0
      helper/refill/api/yl/afd/RefillPhone.php
  19. 12 0
      helper/refill/api/yl/afd/config.php
  20. 13 0
      helper/refill/api/yl/afd/账号信息.txt
  21. BIN
      helper/refill/api/yl/afd/阿凡灯系统接口文档.docx
  22. 50 0
      helper/refill/api/yl/api.php
  23. 40 0
      helper/refill/api/yl/bailian/RefillCallBack.php
  24. 132 0
      helper/refill/api/yl/bailian/RefillOil.php
  25. 48 0
      helper/refill/api/yl/bailian/config.php
  26. 14 0
      helper/refill/api/yl/bailian/开户信息.txt
  27. 67 0
      helper/refill/api/yl/baixuan/RefillCallBack.php
  28. 155 0
      helper/refill/api/yl/baixuan/RefillPhone.php
  29. 44 0
      helper/refill/api/yl/baixuan/config.php
  30. 20 0
      helper/refill/api/yl/baixuan/商品编码.txt
  31. 13 0
      helper/refill/api/yl/baixuan/开户信息.txt
  32. 67 0
      helper/refill/api/yl/baixuan_normal/RefillCallBack.php
  33. 155 0
      helper/refill/api/yl/baixuan_normal/RefillPhone.php
  34. 40 0
      helper/refill/api/yl/baixuan_normal/config.php
  35. 16 0
      helper/refill/api/yl/baixuan_normal/商品编码.txt
  36. 13 0
      helper/refill/api/yl/baixuan_normal/开户信息.txt
  37. 48 0
      helper/refill/api/yl/baixuannew_high/RefillCallBack.php
  38. 155 0
      helper/refill/api/yl/baixuannew_high/RefillPhone.php
  39. 56 0
      helper/refill/api/yl/baixuannew_high/config.php
  40. 29 0
      helper/refill/api/yl/baixuannew_high/对接文档-yezi.txt
  41. 48 0
      helper/refill/api/yl/baixuannew_normal/RefillCallBack.php
  42. 155 0
      helper/refill/api/yl/baixuannew_normal/RefillPhone.php
  43. 56 0
      helper/refill/api/yl/baixuannew_normal/config.php
  44. 31 0
      helper/refill/api/yl/baixuannew_normal/对接文档-yezi.txt
  45. 75 0
      helper/refill/api/yl/bdt/RefillCallBack.php
  46. 90 0
      helper/refill/api/yl/bdt/RefillOil.php
  47. 24 0
      helper/refill/api/yl/bdt/RefillPhone.php
  48. 17 0
      helper/refill/api/yl/bdt/config.php
  49. 59 0
      helper/refill/api/yl/beixt/RefillCallBack.php
  50. 122 0
      helper/refill/api/yl/beixt/RefillPhone.php
  51. 14 0
      helper/refill/api/yl/beixt/config.php
  52. 50 0
      helper/refill/api/yl/bingdht/RefillCallBack.php
  53. 141 0
      helper/refill/api/yl/bingdht/RefillPhone.php
  54. 11 0
      helper/refill/api/yl/bingdht/api.txt
  55. 27 0
      helper/refill/api/yl/bingdht/config.php
  56. 52 0
      helper/refill/api/yl/bjb/RefillCallBack.php
  57. 98 0
      helper/refill/api/yl/bjb/RefillPhone.php
  58. 14 0
      helper/refill/api/yl/bjb/config.php
  59. 53 0
      helper/refill/api/yl/bjbnew/RefillCallBack.php
  60. 98 0
      helper/refill/api/yl/bjbnew/RefillPhone.php
  61. 14 0
      helper/refill/api/yl/bjbnew/config.php
  62. 52 0
      helper/refill/api/yl/bjbyd/RefillCallBack.php
  63. 96 0
      helper/refill/api/yl/bjbyd/RefillPhone.php
  64. 14 0
      helper/refill/api/yl/bjbyd/config.php
  65. 58 0
      helper/refill/api/yl/bxtwt/RefillCallBack.php
  66. 124 0
      helper/refill/api/yl/bxtwt/RefillPhone.php
  67. 14 0
      helper/refill/api/yl/bxtwt/config.php
  68. BIN
      helper/refill/api/yl/cangbu/APIdoc直充.docx
  69. BIN
      helper/refill/api/yl/cangbu/APIdoc直冲(旧).docx
  70. 69 0
      helper/refill/api/yl/cangbu/RefillCallBack.php
  71. 144 0
      helper/refill/api/yl/cangbu/RefillPhone.php
  72. 6 0
      helper/refill/api/yl/cangbu/account.txt
  73. 23 0
      helper/refill/api/yl/cangbu/config.php
  74. BIN
      helper/refill/api/yl/cangbu_high/APIdoc直充.docx
  75. 69 0
      helper/refill/api/yl/cangbu_high/RefillCallBack.php
  76. 144 0
      helper/refill/api/yl/cangbu_high/RefillPhone.php
  77. 3 0
      helper/refill/api/yl/cangbu_high/account.txt
  78. 22 0
      helper/refill/api/yl/cangbu_high/config.php
  79. BIN
      helper/refill/api/yl/cangbukami/APIdoc直充.docx
  80. BIN
      helper/refill/api/yl/cangbukami/APIdoc直冲(旧).docx
  81. 69 0
      helper/refill/api/yl/cangbukami/RefillCallBack.php
  82. 144 0
      helper/refill/api/yl/cangbukami/RefillPhone.php
  83. 6 0
      helper/refill/api/yl/cangbukami/account.txt
  84. 25 0
      helper/refill/api/yl/cangbukami/config.php
  85. BIN
      helper/refill/api/yl/cangbuyd/APIdoc直充.docx
  86. 69 0
      helper/refill/api/yl/cangbuyd/RefillCallBack.php
  87. 144 0
      helper/refill/api/yl/cangbuyd/RefillPhone.php
  88. 4 0
      helper/refill/api/yl/cangbuyd/account.txt
  89. 22 0
      helper/refill/api/yl/cangbuyd/config.php
  90. 66 0
      helper/refill/api/yl/cangxin/RefillCallBack.php
  91. 134 0
      helper/refill/api/yl/cangxin/RefillPhone.php
  92. 37 0
      helper/refill/api/yl/cangxin/config.php
  93. 16 0
      helper/refill/api/yl/cangxin/开户信息.txt
  94. 66 0
      helper/refill/api/yl/cangxin_high/RefillCallBack.php
  95. 134 0
      helper/refill/api/yl/cangxin_high/RefillPhone.php
  96. 37 0
      helper/refill/api/yl/cangxin_high/config.php
  97. 16 0
      helper/refill/api/yl/cangxin_high/开户信息.txt
  98. 66 0
      helper/refill/api/yl/cangxin_yi/RefillCallBack.php
  99. 134 0
      helper/refill/api/yl/cangxin_yi/RefillPhone.php
  100. 0 0
      helper/refill/api/yl/cangxin_yi/config.php

+ 52 - 0
helper/refill/api/yl/afand/RefillCallBack.php

@@ -0,0 +1,52 @@
+<?php
+
+
+namespace refill\afand;
+
+require_once(BASE_HELPER_RAPI_PATH . '/afand/config.php');
+
+
+use refill;
+
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $sign = $this->sign($params);
+        if ($params['sign'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        $content  = config::MCHID . $params['pt_order_id'] . $params['mch_order_id'] . $params['op_order_id'] . $params['tel'];
+        $content .= $params['price'] . $params['pay_type'] . $params['status'] . config::KEY;
+        return md5($content);
+    }
+
+    //[$order_id, $success, $can_try, $need_handle]
+    public function notify($params)
+    {
+        $status = intval($params['status']);
+        $order_sn = $params['mch_order_id'];
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false,false];
+        }
+        $order_id = $order_info['order_id'];
+        
+        $data['official_sn'] = strtolower($params['op_order_id']) == 'null' ? '' : $params['op_order_id'];
+
+        if ($status === 1) {
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false, true];
+        } elseif ($status === 0) {
+            return [$order_id, false, true, true];
+        } else {
+            return [$order_id, false, false, false];
+        }
+    }
+}

+ 110 - 0
helper/refill/api/yl/afand/RefillPhone.php

@@ -0,0 +1,110 @@
+<?php
+
+namespace refill\afand;
+
+require_once(BASE_HELPER_RAPI_PATH . '/afand/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount, int $card_type, string $order_sn)
+    {
+        $params['tel'] = $phone;
+        $params['mch_order_id'] = $order_sn;
+        $params['mchid'] = config::MCHID;
+        $params['price'] = $amount;
+        $params['notify'] = config::NOTIFY_URL;
+        $params['teltype'] = config::operator[$card_type];
+        $params['timeout'] = 50;
+        $params['time'] = time();
+        $params['rand'] = rand(100000,999999);
+
+        return $params;
+    }
+
+    //[$state, $errmsg,$neterr]
+    public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
+    {
+        $params = $this->req_params($card_no, $amount, $card_type, $params['order_sn']);
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+
+        $resp = http_request(config::ORDER_URL, $params , 'POST' , false,[],$net_errno);
+
+        if (empty($resp)) {
+            return [false, '系统错误', true];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '系统错误', true];
+            }
+            $code = intval($resp['code']);
+            if ($code === 0) {
+                return [true, $resp['pt_order_id'], false];
+            } else {
+                return [false, $resp['msg'], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['mch_order_id'] = $refill_info['order_sn'];
+        $params['mchid'] = config::MCHID;
+        $params['pt_order_id'] = $refill_info['ch_trade_no'];
+        $params['mch_order_id'] = $refill_info['order_sn'];
+        $params['op_order_id'] = $refill_info['official_sn'];
+        $params['tel'] = $refill_info['card_no'];
+        $params['time'] = time();
+        $params['rand'] = rand(100000,999999);
+        $content = $params['mchid'] . $params['pt_order_id'] . $params['mch_order_id'] . $params['op_order_id'] . $params['tel'] . $params['time'] . $params['rand'] . config::KEY;
+        $params['sign'] = md5($content);
+        $resp = http_request(config::QUERY_URL, $params , 'POST' , false);
+        if (empty($resp)) {
+            return [false, '系统错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '系统错误'];
+            }
+            $code = intval($resp['code']);
+            if ($code === 0)
+            {
+                if ($resp['data']['status'] === '已支付') {
+                    $order_state = ORDER_STATE_SUCCESS;
+                } elseif ($resp['data']['status'] === '支付失败') {
+                    $order_state = ORDER_STATE_CANCEL;
+                } else {
+                    return [false, $resp['data']];
+                }
+                return [true, $order_state];
+            }
+            else {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+
+
+    private function sign($params)
+    {
+        $key = config::KEY;
+        $content  = $params['mchid'] . $params['tel'] . $params['mch_order_id'] . $params['price'] . $params['teltype'] . $params['timeout'] . $params['notify'];
+        $content .= $params['time'] . $params['rand'] . $key;
+        return md5($content);
+    }
+}

+ 20 - 0
helper/refill/api/yl/afand/config.php

@@ -0,0 +1,20 @@
+<?php
+
+
+namespace refill\afand;
+
+use mtopcard;
+class config
+{
+    const ORDER_URL = 'http://47.98.208.197/api/telpay';
+    const QUERY_URL = 'http://47.98.208.197/api/telpay/query';
+
+    const MCHID = 10019;
+    const KEY = '953b8e10a70ef4e85b77f09448c0e316';
+    const NOTIFY_URL = BASE_SITE_URL . "/mobile/refill_afand.php";
+    const operator = [
+        mtopcard\ChinaMobileCard  => 2,
+        mtopcard\ChinaUnicomCard  => 1,
+        mtopcard\ChinaTelecomCard => 3
+    ];
+}

+ 49 - 0
helper/refill/api/yl/afandeng/RefillCallBack.php

@@ -0,0 +1,49 @@
+<?php
+
+
+namespace refill\afandeng;
+
+require_once(BASE_HELPER_RAPI_PATH . '/afandeng/config.php');
+
+
+use refill;
+
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $sign = $this->sign($params);
+        if ($params['sgn'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        $content = $params['ord'] . $params['state'] . config::KEY;
+        return strtoupper(md5($content));
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['state']);
+        $order_sn = $params['ord'];
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false,false];
+        }
+        $order_id = $order_info['order_id'];
+        $data['official_sn'] = $params['bz'];
+
+        if ($status === 1) {
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false, true];
+        } elseif ($status === 2) {
+            return [$order_id, false, true, true];
+        } else {
+            return [$order_id, false, false, false];
+        }
+    }
+}

+ 100 - 0
helper/refill/api/yl/afandeng/RefillPhone.php

@@ -0,0 +1,100 @@
+<?php
+
+namespace refill\afandeng;
+
+require_once(BASE_HELPER_RAPI_PATH . '/afandeng/config.php');
+
+use refill;
+use Log;
+use mtopcard;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount, string $order_sn)
+    {
+        $params['usr'] = config::USR;
+        $params['mob'] = $phone;
+        $params['amt'] = $amount;
+        $params['ord'] = $order_sn;
+        $params['tim'] = date("YmdHis");
+        $params['yysid'] = 0;
+        $params['hmlx'] = 0;
+        return $params;
+
+    }
+
+    public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
+    {
+        $order_sn = $params['order_sn'];
+        $params = $this->req_params($card_no,$amount,$order_sn);
+        $sign = $this->sign($params);
+        $params['sgn'] = $sign;
+
+        $resp = http_request(config::PAY_PHONE_URL,$params,'GET',false,[],$net_errno);
+
+        if (empty($resp)) {
+            return [false,'系统错误',true];
+        }
+        else
+        {
+            Log::record($resp,Log::DEBUG);
+            $resp = ltrim($resp , '|');
+
+            $resp = explode('|' , $resp);
+            if (count($resp) != 3) {
+                return [false, '返回值错误', false];
+            } elseif ($resp[0] == 0) {
+                return [true, '', false];
+            } else {
+                return [false, $resp[1], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['ord'] = $refill_info['order_sn'];
+        $params['usr'] = config::USR;
+        $content = $params['usr'] . $params['ord'] . config::KEY;
+        $params['sgn'] = strtoupper(md5($content));
+        $resp = http_request(config::QUERY_URL,$params);
+        if (empty($resp)) {
+            return [false,'系统错误'];
+        }
+        else
+        {
+            Log::record($resp,Log::DEBUG);
+            $resp = ltrim($resp , '|');
+            $resp = explode('|' , $resp);
+            if(count($resp) != 3) {
+                return [false,'返回值错误'];
+            } elseif ($resp[0] === 1) {
+                $order_state = ORDER_STATE_SUCCESS;
+            } elseif ($resp[0] === 2) {
+                $order_state = ORDER_STATE_CANCEL;
+            } elseif ($resp[0] === 0){
+                $order_state = ORDER_STATE_SEND;
+            } else {
+                return [false, $resp[0]];
+            }
+            return [true, $order_state];
+        }
+    }
+
+    public function balance()
+    {
+        return [false, '暂无余额接口'];
+    }
+
+    private function sign($params)
+    {
+        $key = config::KEY;
+        $content = $params['usr'] . $params['ord'] . $params['mob'] . $params['amt'] . $params['tim'] . $key;
+        return strtoupper(md5($content));
+    }
+}

+ 13 - 0
helper/refill/api/yl/afandeng/config.php

@@ -0,0 +1,13 @@
+<?php
+
+
+namespace refill\afandeng;
+
+
+class config
+{
+    const PAY_PHONE_URL = 'http://8.140.101.13:806/webInface/PayPhone.ashx';
+    const QUERY_URL= 'http://8.140.101.13:806/webInface/GetOrderState.ashx';
+    const USR= 'afandeng';
+    const KEY = 'd54e3cac95dec6839e74313740ce2ab1';
+}

+ 47 - 0
helper/refill/api/yl/afandfs/RefillCallBack.php

@@ -0,0 +1,47 @@
+<?php
+
+
+namespace refill\afandfs;
+
+require_once(BASE_HELPER_RAPI_PATH . '/afandfs/config.php');
+
+use refill;
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $sign = $this->sign($params);
+        if ($params['sign'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        $content = $params['code'] . config::PARTNER_ID . $params['partner_order_no'] . $params['phone'] . $params['amount'] . $params['official_order_id'] . config::KEY;
+        return md5($content);
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['code']);
+        $order_sn = $params['partner_order_no'];
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false, false];
+        }
+
+        $order_id = $order_info['order_id'];
+        if ($status === 1) {
+            $data['official_sn'] = strtolower($params['official_order_id']) == 'null' ? '' : $params['official_order_id'];
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false, true];
+        } elseif ($status === 0) {
+            return [$order_id, false, true, true];
+        } else {
+            return [$order_id, false, false, false];
+        }
+    }
+}

+ 108 - 0
helper/refill/api/yl/afandfs/RefillPhone.php

@@ -0,0 +1,108 @@
+<?php
+
+namespace refill\afandfs;
+
+require_once(BASE_HELPER_RAPI_PATH . '/afandfs/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount, int $card_type, string $order_sn)
+    {
+        $params['partner_id'] = config::PARTNER_ID;
+        $params['partner_order_no'] = $order_sn;
+        $params['phone'] = $phone;
+        $params['amount'] = $amount;
+        $params['charge_type'] = config::operator[$card_type];
+        $params['notify_url'] = config::NOTIFY_URL;
+
+        return $params;
+    }
+
+    public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
+    {
+        $params = $this->req_params($card_no, $amount, $card_type, $params['order_sn']);
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+
+        $resp = http_request(config::ORDER_URL, $params , 'POST' , false , config::ExtHeaders,$net_errno);
+
+        if (empty($resp)) {
+            return [false, '系统错误',true];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '系统错误', true];
+            } elseif ($resp['code'] == 1) {
+                return [true, $resp['data'], false];
+            } else {
+                return [false, $resp['msg'], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['partner_id'] = config::PARTNER_ID;
+        $params['partner_order_no'] = $refill_info['order_sn'];
+        $content = $params['partner_id'] . $params['partner_order_no'] . config::KEY;
+        $params['sign'] = md5($content);
+
+        $resp = http_request(config::QUERY_URL, $params , 'POST' , false , config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '系统错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+
+            if (empty($resp)) {
+                return [false, '系统错误'];
+            }
+            elseif ($resp['code'] == 1)
+            {
+                $status = intval($resp['data']['code']);
+                if ($status == 1) {
+                    $order_state = ORDER_STATE_SUCCESS;
+                    $save['official_sn'] = $resp['data']['official_order_id'];
+                    Model('refill_order')->edit($refill_info['order_id'], $save);
+                } elseif ($status == 0) {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif ($status == 2) {
+                    $order_state = ORDER_STATE_SEND;
+                } else {
+                    return [false, $resp['msg']];
+                }
+
+                return [true, $order_state];
+            }
+            else {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+    public function balance()
+    {
+        return [false, '暂无余额接口'];
+    }
+
+    private function sign($params)
+    {
+        $key = config::KEY;
+        $content = $params['partner_id'] . $params['partner_order_no'] . $params['phone'] . $params['amount'] . $params['notify_url'] . $key;
+        return md5($content);
+    }
+}

+ 20 - 0
helper/refill/api/yl/afandfs/config.php

@@ -0,0 +1,20 @@
+<?php
+namespace refill\afandfs;
+
+use mtopcard;
+class config
+{
+    const ORDER_URL = 'http://150.107.3.58/api/receiveOrder';
+    const QUERY_URL = 'http://150.107.3.58/api/queryOrder';
+    const BALANCE_URL = 'http://119.8.102.95/api/quotaQuery';
+
+    const PARTNER_ID = '52';
+    const KEY = '8dd29f631f84b11f4ed4c2fbfcfc4057';
+    const NOTIFY_URL =  BASE_SITE_URL."/mobile/refill_afandfs.php";
+    const operator = [
+        mtopcard\ChinaMobileCard  => 2,
+        mtopcard\ChinaUnicomCard  => 0,
+        mtopcard\ChinaTelecomCard => 1
+    ];
+    const ExtHeaders = ['Content-Type: application/x-www-form-urlencoded'];
+}

+ 19 - 0
helper/refill/api/yl/afandfs/北京分省账户.txt

@@ -0,0 +1,19 @@
+????????http://119.8.102.95/api/receiveOrder
+???????http://119.8.102.95/api/queryOrder
+???????http://119.8.102.95/api/quotaQuery
+
+
+???IP
+119.8.102.95
+
+
+
+
+http://119.8.102.95/index.html
+
+afd0017
+123456afd0017
+
+
+
+???  130c44ac97bf094b6c7e448be1fbee8f

BIN
helper/refill/api/yl/afandfs/阿凡灯分省对接文档.docx


+ 73 - 0
helper/refill/api/yl/afandnew/RefillCallBack.php

@@ -0,0 +1,73 @@
+<?php
+
+
+namespace refill\afandnew;
+
+require_once(BASE_HELPER_RAPI_PATH . '/afandnew/config.php');
+
+use refill;
+
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $input = $params;
+        unset($input['sign']);
+
+        $sign = $this->sign($input);
+        if ($params['sign'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+
+    private function sign($params)
+    {
+        $content = '';
+        ksort($params);
+        foreach ($params as $key => $val) {
+            if (false === $this->check_empty($val) && "@" != substr($val, 0, 1)) {
+                $content .= "{$key}={$val}&";
+            }
+        }
+        $content .= "key=" . config::KEY;
+
+        return strtoupper(md5($content));
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['orderStatus']);
+        $order_sn = $params['orderNo'];
+
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false, false];
+        }
+
+        $order_id = $order_info['order_id'];
+        $data['official_sn'] = strtolower($params['carrierOrderNo']) == 'null' ? '' : $params['carrierOrderNo'];
+
+        if ($status === 2) {
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false, true];
+        } elseif ($status === 3) {
+            return [$order_id, false, true, true];
+        } else {
+            return [$order_id, false, false, false];
+        }
+    }
+}

+ 114 - 0
helper/refill/api/yl/afandnew/RefillPhone.php

@@ -0,0 +1,114 @@
+<?php
+
+namespace refill\afandnew;
+
+require_once(BASE_HELPER_RAPI_PATH . '/afandnew/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount, string $order_sn)
+    {
+        $params['appId'] = config::APP_ID;
+        $params['mobile'] = $phone;
+        $params['amount'] = $amount;
+        $params['orderNo'] = $order_sn;
+        $params['notifyUrl'] = config::NOTIFY_URL;
+        return $params;
+    }
+
+    public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
+    {
+        $params = $this->req_params($card_no, $amount, $params['order_sn']);
+        $params['productNo'] = config::ProductIDS[$card_type][$amount];
+        if (empty($params['productNo'])) {
+            return [false, '产品编号错误', false];
+        }
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+
+        $resp = http_request(config::ORDER_URL, $params, 'POST', false, config::ExtHeaders, $net_errno);
+
+        if (empty($resp)) {
+            return [false, '系统错误', true];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '系统错误', true];
+            } elseif ($resp['code'] == 200) {
+                return [true, $resp['data']['tradeNo'], false];
+            } else {
+                return [false, $resp['msg'], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['tradeNo'] = $refill_info['ch_trade_no'];
+        $params['appId'] = config::APP_ID;
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+
+        $resp = http_request(config::QUERY_URL, $params, 'POST', false, config::ExtHeaders);
+        if (empty($resp)) {
+            return [false, '系统错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '系统错误'];
+            }
+            elseif ($resp['code'] == 200)
+            {
+                $data = $resp['data'];
+                if ($data['orderStatus'] == 2) {
+                    $order_state = ORDER_STATE_SUCCESS;
+                    $updata['official_sn'] = strtolower($data['carrierOrderNo']) == 'null' ? '' : $data['carrierOrderNo'];
+                    Model('refill_order')->edit($refill_info['order_id'], $updata);
+                } elseif ($data['orderStatus'] == 3) {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif ($data['orderStatus'] == 1) {
+                    $order_state = ORDER_STATE_SEND;
+                } else {
+                    return [false, $resp['msg']];
+                }
+                return [true, $order_state];
+            }
+            else {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+    public function balance()
+    {
+        return [false, '暂无余额接口'];
+    }
+
+    private function sign($params)
+    {
+        $content = '';
+        ksort($params);
+        foreach ($params as $key => $val) {
+            if (false === $this->check_empty($val) && "@" != substr($val, 0, 1)) {
+                $content .= "{$key}={$val}&";
+            }
+        }
+        $content .= "key=" . config::KEY;
+
+        return strtoupper(md5($content));
+    }
+}

+ 14 - 0
helper/refill/api/yl/afandnew/afd007.txt

@@ -0,0 +1,14 @@
+后台地址:http://ddd.nvtu.ren/boss/login
+账户名:afd007 密码:123456
+
+AppID:RC5229f3ef515e4b34adfb9aa251b5e15e
+Key:9803e5a3e4984ea4b8f847de28f22e2f
+
+订单下单接口:
+地址:http://ddd.nvtu.ren/gateway/recharge
+
+订单查询接口:
+地址:?http://ddd.nvtu.ren/gateway/recharge/order
+
+账户余额查询接口:
+地址:?http://ddd.nvtu.ren/gateway/balance/query

+ 32 - 0
helper/refill/api/yl/afandnew/config.php

@@ -0,0 +1,32 @@
+<?php
+
+
+namespace refill\afandnew;
+use mtopcard;
+
+class config
+{
+    const ORDER_URL = 'http://ddd.nvtu.ren/gateway/recharge';
+    const QUERY_URL = 'http://ddd.nvtu.ren/gateway/recharge/order';
+
+    const APP_ID = 'RC5229f3ef515e4b34adfb9aa251b5e15e';
+    const KEY = '9803e5a3e4984ea4b8f847de28f22e2f';
+    const NOTIFY_URL = BASE_SITE_URL . "/mobile/refill_afandnew.php";
+    const ExtHeaders = ['Content-Type: application/x-www-form-urlencoded'];
+
+    const ProductIDS = [
+        mtopcard\ChinaMobileCard  => [
+            10 => '2110000010101', 20 => '2110000020101', 30 => '2110000030101',
+            50 => '2110000050000', 100 => '21100000100000', 200 => '21100000200101'
+        ],
+        mtopcard\ChinaUnicomCard  => [
+            50 => '2310000050101', 100 => '23100000100101', 200 => '23100000200101',
+            300 => '23100000300101'
+        ],
+        mtopcard\ChinaTelecomCard => [
+            30 => '2210000030101',
+            50 => '2210000050101', 100 => '22100000100101', 200 => '22100000200101',
+            300 => '22100000300101', 500 => '22100000500101'
+        ]
+    ];
+}

+ 628 - 0
helper/refill/api/yl/afandnew/阿凡灯充值系统2.2.doc

@@ -0,0 +1,628 @@
+<html xmlns:v="urn:schemas-microsoft-com:vml"
+    xmlns:o="urn:schemas-microsoft-com:office:office"
+    xmlns:w="urn:schemas-microsoft-com:office:word"
+    xmlns="http://www.w3.org/TR/REC-html40">
+    <head><meta http-equiv=Content-Type content="text/html; charset=utf-8">
+    <style type="text/css">
+        table  
+        {  
+            border-collapse: collapse;
+            border: none;  
+            width: 100%;  
+        }  
+        td,tr  
+        {  
+            border: solid #CCC 1px;
+            padding:3px;
+            font-size:9pt;
+        } 
+        .codestyle{
+            word-break: break-all;
+            mso-highlight:rgb(252, 252, 252);
+            padding-left: 5px; background-color: rgb(252, 252, 252); border: 1px solid rgb(225, 225, 232);
+        }
+        img {
+            width:100;
+        }
+    </style>
+    <meta name=ProgId content=Word.Document>
+    <meta name=Generator content="Microsoft Word 11">
+    <meta name=Originator content="Microsoft Word 11">
+    <xml><w:WordDocument><w:View>Print</w:View></xml></head>
+    <body><h1>1、签名规则</h1><div style="margin-left:20px;"><blockquote>
+<p>签名生成的通用步骤如下</p>
+</blockquote>
+<p><strong>第一步:</strong>设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。<br/><br/>
+特别注意以下重要规则:<br/><br/>
+◆ 参数名ASCII码从小到大排序(字典序);<br/><br/>
+◆ 如果参数的值为空不参与签名;<br/><br/>
+◆ 参数名区分大小写;<br/><br/>
+◆ 验证调用返回或系统主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。<br/><br/>
+
+<p><strong>第二步:</strong>在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。  </p>
+
+<p>如请求系统参数如下:</p>
+
+<table width='100%' class='codestyle'><pre><code>    Map signMap = new HashMap<>();
+    signMap.put("appId", "test01");
+    signMap.put("mobile", "18698798721");
+    signMap.put("productNo", '2110000050000');
+    signMap.put("amount", 50);
+    signMap.put("orderNo", "12345");
+    signMap.put("notifyUrl", "xxxxxx");
+</code></pre></table>
+
+<p><code>待签名值</code>:amount=50&appId=test01&mobile=18698798721&<span>notifyUrl</span>=xxxxxx&orderNo=12345&productNo=2110000050000&key=EWEFD123RGSRETYDFNGFGFGSHDFGH</p><br/>
+<code>签名结果</code>:7864F84DE809CE3FA0C080FB516FD991<br/>
+
+##### 备注 
+appId 和 key请到代理商户后台 “账户管理 - 账户信息” 中查看</div><h1>2、充值提交</h1><div style="margin-left:20px;"><h5>简要描述</h5>
+<ul>
+<li>话费入单接口,接收话费商推送过来的话单。</li>
+</ul>
+<h5>请求URL</h5>
+<ul>
+<li><code>http://xx.com/gateway/recharge</code></li>
+</ul>
+<h5>请求方式</h5>
+<ul>
+<li>POST </li>
+</ul>
+<h5>参数</h5>
+<table>
+<thead><tr style='background-color: rgb(0, 136, 204); color: rgb(255, 255, 255);'>
+<th style="text-align: left;">参数名</th>
+<th style="text-align: left;">必选</th>
+<th style="text-align: left;">类型</th>
+<th>说明</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td style="text-align: left;">appId</td>
+<td style="text-align: left;">是</td>
+<td style="text-align: left;">string</td>
+<td>appId,可后台查看</td>
+</tr>
+<tr>
+<td style="text-align: left;">mobile</td>
+<td style="text-align: left;">是</td>
+<td style="text-align: left;">string</td>
+<td>长度11</td>
+</tr>
+<tr>
+<td style="text-align: left;">productNo</td>
+<td style="text-align: left;">是</td>
+<td style="text-align: left;">string</td>
+<td>具体值看下面商品NO</td>
+</tr>
+<tr>
+<td style="text-align: left;">amount</td>
+<td style="text-align: left;">是</td>
+<td style="text-align: left;">string</td>
+<td>金额元</td>
+</tr>
+<tr>
+<td style="text-align: left;">orderNo</td>
+<td style="text-align: left;">是</td>
+<td style="text-align: left;">string</td>
+<td>订单号,长度最大30位</td>
+</tr>
+<tr>
+<td style="text-align: left;">notifyUrl</td>
+<td style="text-align: left;">是</td>
+<td style="text-align: left;">string</td>
+<td>异步通知地址,长度最大300位</td>
+</tr>
+<tr>
+<td style="text-align: left;">sign</td>
+<td style="text-align: left;">是</td>
+<td style="text-align: left;">string</td>
+<td>见签名规则</td>
+</tr>
+</tbody>
+</table>
+<h5>返回示例</h5>
+<table width='100%' class='codestyle'><pre><code>{
+    "code": 200,
+    "msg": "",
+    "data": {
+        "moblie": "18676709241",
+        "orderNo": "22222222222",
+        "tradeNo": "2020092817541471344"
+    }
+}</code></pre></table>
+<h5>返回参数说明</h5>
+<table>
+<thead><tr style='background-color: rgb(0, 136, 204); color: rgb(255, 255, 255);'>
+<th style="text-align: left;">参数名</th>
+<th style="text-align: left;">类型</th>
+<th>说明</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td style="text-align: left;">code</td>
+<td style="text-align: left;">int</td>
+<td>返回码</td>
+</tr>
+<tr>
+<td style="text-align: left;">msg</td>
+<td style="text-align: left;">String</td>
+<td>返回信息</td>
+</tr>
+<tr>
+<td style="text-align: left;">data</td>
+<td style="text-align: left;">json</td>
+<td>成功返回数据</td>
+</tr>
+<tr>
+<td style="text-align: left;">moblie</td>
+<td style="text-align: left;">String</td>
+<td>手机号码</td>
+</tr>
+<tr>
+<td style="text-align: left;">orderNo</td>
+<td style="text-align: left;">String</td>
+<td>商户订单号</td>
+</tr>
+<tr>
+<td style="text-align: left;">tradeNo</td>
+<td style="text-align: left;">String</td>
+<td>交易订单号</td>
+</tr>
+</tbody>
+</table>
+<h5>商品NO说明</h5>
+<table>
+<thead><tr style='background-color: rgb(0, 136, 204); color: rgb(255, 255, 255);'>
+<th style="text-align: left;">商品编号</th>
+<th>商品名称</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td style="text-align: left;">23100000200101</td>
+<td>全国联通200话费</td>
+</tr>
+<tr>
+<td style="text-align: left;">23100000100101</td>
+<td>全国联通100话费</td>
+</tr>
+<tr>
+<td style="text-align: left;">2310000050101</td>
+<td>全国联通50话费</td>
+</tr>
+<tr>
+<td style="text-align: left;">22100000200101</td>
+<td>全国电信200话费</td>
+</tr>
+<tr>
+<td style="text-align: left;">22100000100101</td>
+<td>全国电信100话费</td>
+</tr>
+<tr>
+<td style="text-align: left;">2210000050101</td>
+<td>全国电信50话费</td>
+</tr>
+<tr>
+<td style="text-align: left;">21100000200101</td>
+<td>全国移动200话费</td>
+</tr>
+<tr>
+<td style="text-align: left;">2110000050000</td>
+<td>全国移动50话费</td>
+</tr>
+<tr>
+<td style="text-align: left;">21100000100000</td>
+<td>全国移动100元话费</td>
+</tr>
+</tbody>
+</table>
+<h5>备注</h5>
+<ul>
+<li>返回码code
+200 提交成功
+其他 提交失败</li>
+</ul>
+<h5>错误码表</h5>
+<table>
+<thead><tr style='background-color: rgb(0, 136, 204); color: rgb(255, 255, 255);'>
+<th style="text-align: left;">code</th>
+<th>msg</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td style="text-align: left;">200</td>
+<td>OK</td>
+</tr>
+<tr>
+<td style="text-align: left;">999</td>
+<td>异常</td>
+</tr>
+<tr>
+<td style="text-align: left;">100</td>
+<td>sign不正确</td>
+</tr>
+<tr>
+<td style="text-align: left;">101</td>
+<td>请求ip不在白名单</td>
+</tr>
+<tr>
+<td style="text-align: left;">110</td>
+<td>参数异常</td>
+</tr>
+<tr>
+<td style="text-align: left;">120</td>
+<td>商品不存在</td>
+</tr>
+<tr>
+<td style="text-align: left;">121</td>
+<td>充值金额和商品编号不对应</td>
+</tr>
+<tr>
+<td style="text-align: left;">130</td>
+<td>商户appId错误</td>
+</tr>
+<tr>
+<td style="text-align: left;">131</td>
+<td>商户被冻结</td>
+</tr>
+<tr>
+<td style="text-align: left;">132</td>
+<td>商户被注销</td>
+</tr>
+<tr>
+<td style="text-align: left;">140</td>
+<td>平台维护中</td>
+</tr>
+<tr>
+<td style="text-align: left;">144</td>
+<td>产品运营商和号码不匹配</td>
+</tr>
+<tr>
+<td style="text-align: left;">141</td>
+<td>省份维护中</td>
+</tr>
+<tr>
+<td style="text-align: left;">142</td>
+<td>运营商维护中</td>
+</tr>
+<tr>
+<td style="text-align: left;">143</td>
+<td>号码黑名单中</td>
+</tr>
+<tr>
+<td style="text-align: left;">144</td>
+<td>号码提交太频繁</td>
+</tr>
+<tr>
+<td style="text-align: left;">145</td>
+<td>号码信息获取失败</td>
+</tr>
+<tr>
+<td style="text-align: left;">150</td>
+<td>订单已经存在</td>
+</tr>
+<tr>
+<td style="text-align: left;">151</td>
+<td>订单不存在</td>
+</tr>
+<tr>
+<td style="text-align: left;">160</td>
+<td>账户被冻结</td>
+</tr>
+<tr>
+<td style="text-align: left;">161</td>
+<td>账户异常</td>
+</tr>
+<tr>
+<td style="text-align: left;">162</td>
+<td>账户余额不足</td>
+</tr>
+<tr>
+<td style="text-align: left;">163</td>
+<td>未知交易类型</td>
+</tr>
+<tr>
+<td style="text-align: left;">164</td>
+<td>支付其他错误</td>
+</tr>
+<tr>
+<td style="text-align: left;">165</td>
+<td>账户不存在</td>
+</tr>
+<tr>
+<td style="text-align: left;">170</td>
+<td>商品没设置供货商</td>
+</tr>
+<tr>
+<td style="text-align: left;">171</td>
+<td>找不到合适的供货商</td>
+</tr>
+<tr>
+<td style="text-align: left;">172</td>
+<td>没有供货商接口</td>
+</tr>
+<tr>
+<td style="text-align: left;">173</td>
+<td>供货繁忙</td>
+</tr>
+</tbody>
+</table></div><h1>3、异步通知结果</h1><div style="margin-left:20px;"><h5>简要描述</h5>
+<ul>
+<li>异步通知结果</li>
+</ul>
+<h5>请求URL</h5>
+<ul>
+<li><code>充值提交的通知地址,需加白的,请咨询我方相关人员提供IP</code></li>
+</ul>
+<h5>请求方式</h5>
+<ul>
+<li>POST
+content-type  : application/json
+<h5>参数</h5></li>
+</ul>
+<table>
+<thead><tr style='background-color: rgb(0, 136, 204); color: rgb(255, 255, 255);'>
+<th style="text-align: left;">参数名</th>
+<th style="text-align: left;">必选</th>
+<th style="text-align: left;">类型</th>
+<th>说明</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td style="text-align: left;">tradeNo</td>
+<td style="text-align: left;">是</td>
+<td style="text-align: left;">string</td>
+<td>平台交易订单号</td>
+</tr>
+<tr>
+<td style="text-align: left;">orderNo</td>
+<td style="text-align: left;">是</td>
+<td style="text-align: left;">string</td>
+<td>代理商户订单号</td>
+</tr>
+<tr>
+<td style="text-align: left;">orderStatus</td>
+<td style="text-align: left;">是</td>
+<td style="text-align: left;">int</td>
+<td>1:处理中,2:成功,3:失败,9:未确认</td>
+</tr>
+<tr>
+<td style="text-align: left;">amount</td>
+<td style="text-align: left;">是</td>
+<td style="text-align: left;">int</td>
+<td>充值金额,单位元</td>
+</tr>
+<tr>
+<td style="text-align: left;">mobile</td>
+<td style="text-align: left;">是</td>
+<td style="text-align: left;">string</td>
+<td>手机号</td>
+</tr>
+<tr>
+<td style="text-align: left;">carrierOrderNo</td>
+<td style="text-align: left;">否</td>
+<td style="text-align: left;">string</td>
+<td>运营商流水号</td>
+</tr>
+<tr>
+<td style="text-align: left;">sign</td>
+<td style="text-align: left;">是</td>
+<td style="text-align: left;">string</td>
+<td>见签名规则</td>
+</tr>
+</tbody>
+</table>
+<h5>返回示例</h5>
+<table width='100%' class='codestyle'><pre><code>  {
+      "tradeNo": "123",
+      "orderNo": "12154545",
+      "orderStatus": 2,
+      "amont": 20 ,
+      "mobile": "1436864169",
+      "carrierOrderNo": "1008634343242343434",
+      "sign":"-----"
+    }</code></pre></table>
+<h5>备注</h5>
+<ul>
+<li>收到请求,需返回<strong>小写</strong>字符: success</li>
+</ul></div><h1>4、订单查询</h1><div style="margin-left:20px;"><h5>简要描述</h5>
+<ul>
+<li>订单查询</li>
+</ul>
+<h5>请求URL</h5>
+<ul>
+<li><code>http://xx.com/gateway/recharge/order</code></li>
+</ul>
+<h5>请求方式</h5>
+<ul>
+<li>POST  application/x-www-form-urlencoded</li>
+</ul>
+<h5>参数</h5>
+<table>
+<thead><tr style='background-color: rgb(0, 136, 204); color: rgb(255, 255, 255);'>
+<th style="text-align: left;">参数名</th>
+<th style="text-align: left;">必选</th>
+<th style="text-align: left;">类型</th>
+<th>说明</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td style="text-align: left;">appId</td>
+<td style="text-align: left;">是</td>
+<td style="text-align: left;">string</td>
+<td>用户名</td>
+</tr>
+<tr>
+<td style="text-align: left;">tradeNo</td>
+<td style="text-align: left;">是</td>
+<td style="text-align: left;">string</td>
+<td>平台交易号</td>
+</tr>
+<tr>
+<td style="text-align: left;">sign</td>
+<td style="text-align: left;">是</td>
+<td style="text-align: left;">string</td>
+<td>签名</td>
+</tr>
+</tbody>
+</table>
+<h5>返回参数说明</h5>
+<table>
+<thead><tr style='background-color: rgb(0, 136, 204); color: rgb(255, 255, 255);'>
+<th style="text-align: left;">参数名</th>
+<th style="text-align: left;">类型</th>
+<th>说明</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td style="text-align: left;">code</td>
+<td style="text-align: left;">int</td>
+<td>200查询成功,其他查询失败</td>
+</tr>
+<tr>
+<td style="text-align: left;">msg</td>
+<td style="text-align: left;">string</td>
+<td>描述信息</td>
+</tr>
+<tr>
+<td style="text-align: left;">data</td>
+<td style="text-align: left;">json</td>
+<td>成功返回信息</td>
+</tr>
+<tr>
+<td style="text-align: left;">orderNo</td>
+<td style="text-align: left;">string</td>
+<td>商户订单号</td>
+</tr>
+<tr>
+<td style="text-align: left;">tradeNo</td>
+<td style="text-align: left;">string</td>
+<td>平台交易号</td>
+</tr>
+<tr>
+<td style="text-align: left;">productNo</td>
+<td style="text-align: left;">string</td>
+<td>商品编号</td>
+</tr>
+<tr>
+<td style="text-align: left;">orderStatus</td>
+<td style="text-align: left;">int</td>
+<td>1:处理中,2:成功,3:失败,9:未确认</td>
+</tr>
+<tr>
+<td style="text-align: left;">moblie</td>
+<td style="text-align: left;">string</td>
+<td>手机号</td>
+</tr>
+<tr>
+<td style="text-align: left;">facePrice</td>
+<td style="text-align: left;">string</td>
+<td>订单面值(元)</td>
+</tr>
+<tr>
+<td style="text-align: left;">carrierOrderNo</td>
+<td style="text-align: left;">string</td>
+<td>运营商流水号</td>
+</tr>
+</tbody>
+</table>
+<h5>返回示例</h5>
+<table width='100%' class='codestyle'><pre><code>{
+    "code": 200,
+    "msg": "OK",
+    "data": {
+        "orderNo": "22222222233",
+        "tradeNo": "2020111013362583735",
+        "productNo": "2110000050000",
+        "orderStatus": 3,
+        "moblie": "13670074035",
+        "facePrice": "50"
+    }
+}</code></pre></table></div><h1>5、余额查询</h1><div style="margin-left:20px;"><h5>简要描述</h5>
+<ul>
+<li>查询余额</li>
+</ul>
+<h5>请求URL</h5>
+<ul>
+<li><code>http://xx.com/gateway/balance/query</code></li>
+</ul>
+<h5>请求方式</h5>
+<ul>
+<li>POST  application/x-www-form-urlencoded</li>
+</ul>
+<h5>参数</h5>
+<table>
+<thead><tr style='background-color: rgb(0, 136, 204); color: rgb(255, 255, 255);'>
+<th style="text-align: left;">参数名</th>
+<th style="text-align: left;">必选</th>
+<th style="text-align: left;">类型</th>
+<th>说明</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td style="text-align: left;">appId</td>
+<td style="text-align: left;">是</td>
+<td style="text-align: left;">string</td>
+<td>用户名</td>
+</tr>
+<tr>
+<td style="text-align: left;">sign</td>
+<td style="text-align: left;">是</td>
+<td style="text-align: left;">string</td>
+<td>签名</td>
+</tr>
+</tbody>
+</table>
+<h5>返回参数说明</h5>
+<table>
+<thead><tr style='background-color: rgb(0, 136, 204); color: rgb(255, 255, 255);'>
+<th style="text-align: left;">参数名</th>
+<th style="text-align: left;">类型</th>
+<th>说明</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td style="text-align: left;">code</td>
+<td style="text-align: left;">int</td>
+<td>200查询成功,其他查询失败</td>
+</tr>
+<tr>
+<td style="text-align: left;">msg</td>
+<td style="text-align: left;">string</td>
+<td>描述信息</td>
+</tr>
+<tr>
+<td style="text-align: left;">data</td>
+<td style="text-align: left;">json</td>
+<td>成功返回信息</td>
+</tr>
+<tr>
+<td style="text-align: left;">totalBalance</td>
+<td style="text-align: left;">string</td>
+<td>余额(元)</td>
+</tr>
+<tr>
+<td style="text-align: left;">credit</td>
+<td style="text-align: left;">string</td>
+<td>授信(元)</td>
+</tr>
+</tbody>
+</table>
+<h5>返回示例</h5>
+<table width='100%' class='codestyle'><pre><code>{
+    "code": 200,
+    "msg": "OK",
+    "data": {
+        "totalBalance": "-86.80",
+        "credit": "10.00"
+    }
+}</code></pre></table></div></body></html>

+ 50 - 0
helper/refill/api/yl/afd/RefillCallBack.php

@@ -0,0 +1,50 @@
+<?php
+namespace refill\afd;
+
+require_once(BASE_HELPER_RAPI_PATH . '/afd/config.php');
+
+use refill;
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $sign = $this->sign($params);
+        if ($params['sign'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        //有中文需要转码
+        if(preg_match('/[^\x00-\x80]/',$params['orderid'])){
+            $params['orderid'] =iconv("UTF-8","gb2312",$params['orderid']);
+        }
+        $content  = $params['merchantorderId'] . $params['platformorderid'] . $params['orderid'] . $params['rechargeno'] . $params['amount'];
+        $content .= $params['rechargestate'] . config::MER_ID;
+        return md5($content);
+    }
+
+    //[$order_id, $success, $can_try, $need_handle]
+    public function notify($params)
+    {
+        $status = intval($params['rechargestate']);
+        $order_sn = $params['merchantorderId'];
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false,false];
+        }
+        $order_id = $order_info['order_id'];
+        if ($status === 99) {
+            $data['official_sn'] = strtolower($params['orderid']) == 'null' ? '' : $params['orderid'];
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false, true];
+        } elseif ($status === 3) {
+            return [$order_id, false, true, true];
+        } else {
+            return [$order_id, false, false, false];
+        }
+    }
+}

+ 110 - 0
helper/refill/api/yl/afd/RefillPhone.php

@@ -0,0 +1,110 @@
+<?php
+namespace refill\afd;
+
+require_once(BASE_HELPER_RAPI_PATH . '/afd/config.php');
+
+use refill;
+use Log;
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount, string $order_sn)
+    {
+        $params['merid'] = config::MER_ID;
+        $params['type'] = 'phone';
+        $params['rechargeno'] = $phone;
+        $params['amount'] = $amount;
+        $params['ts'] = $this->getMillisecond();
+        $params['callbackurl'] = config::NOTIFY_URL;
+        $params['orderid'] = $order_sn;
+        return $params;
+    }
+
+    public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
+    {
+        $params = $this->req_params($card_no, $amount, $params['order_sn']);
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+        $resp = http_request(config::ORDER_URL, $params , 'POST' , false , [] ,$net_errno);
+        if (empty($resp)) {
+            return [false, '系统错误', true];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '系统错误', true];
+            } elseif ($resp['code'] === '000') {
+                return [true, $resp['orderno'], false];
+            } else {
+                return [false, $resp['msg'], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['merid'] = config::MER_ID;
+        $params['merchantorderId'] = $refill_info['order_sn'];
+        $params['ts'] = $this->getMillisecond();
+        $content = $params['merid'] . $params['merchantorderId'] . $params['ts'] . config::KEY;
+        $params['sign'] = md5($content);
+        $resp = http_request(config::QUERY_URL, $params , 'POST' , false);
+        if (empty($resp)) {
+            return [false, '系统错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '系统错误'];
+            }
+            elseif($resp['code'] === '000')
+            {
+                if ($resp['rechargestate'] == 99) {
+                    $order_state = ORDER_STATE_SUCCESS;
+                    $save['official_sn'] = $resp['orderid'];
+                    Model('refill_order')->edit($refill_info['order_id'], $save);
+                } elseif ($resp['rechargestate'] == 3) {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif (in_array($resp['rechargestate'] , [98,2])) {
+                    $order_state = ORDER_STATE_SEND;
+                } else {
+                    return [false, $resp['rechargestate']];
+                }
+                return [true, $order_state];
+            }
+            else {
+                return [false, $resp['code']];
+            }
+        }
+    }
+
+    public function balance()
+    {
+        return [false, '暂无余额接口'];
+    }
+
+    private function sign($params)
+    {
+        $content  = $params['amount'] . $params['callbackurl'] . $params['merid'] . $params['orderid'] . $params['rechargeno'] . $params['ts'] . $params['type'];
+        $content .= config::KEY;
+        return md5($content);
+    }
+
+    /**
+     * 获取毫秒级别的时间戳
+     */
+    private function getMillisecond()
+    {
+        $cur = microtime (true);
+        $cur = intval($cur * 1000);
+        return $cur;
+    }
+}

+ 12 - 0
helper/refill/api/yl/afd/config.php

@@ -0,0 +1,12 @@
+<?php
+namespace refill\afd;
+
+class config
+{
+    const ORDER_URL = 'http://117.24.13.19:7100/home/recharge';
+    const QUERY_URL = 'http://117.24.13.19:7100/home/query';
+
+    const MER_ID = '7012';
+    const KEY = 'bfbe95e2030191aa3ac89a5ae3848241';
+    const NOTIFY_URL = BASE_SITE_URL . "/mobile/callback/refill_afd.php";
+}

+ 13 - 0
helper/refill/api/yl/afd/账号信息.txt

@@ -0,0 +1,13 @@
+
+登录地址:http://117.24.13.19:7999/
+登录账户:yezi001
+登录密码:yezi001
+用户编号7012
+
+接口地址:
+下单   http://117.24.13.19:7100/home/recharge
+查单   http://117.24.13.19:7100/home/query
+余额   http://117.24.13.19:7100/home/getbalance
+
+
+秘钥bfbe95e2030191aa3ac89a5ae3848241

BIN
helper/refill/api/yl/afd/阿凡灯系统接口文档.docx


+ 50 - 0
helper/refill/api/yl/api.php

@@ -0,0 +1,50 @@
+<?php
+
+require_once(BASE_HELPER_RAPI_PATH . '/tianjt/RefillOil.php');
+require_once(BASE_HELPER_RAPI_PATH . '/tianjt/RefillPhone.php');
+require_once(BASE_HELPER_RAPI_PATH . '/tianjt/RefillCallBack.php');
+require_once(BASE_HELPER_RAPI_PATH . '/suhctm/RefillOil.php');
+require_once(BASE_HELPER_RAPI_PATH . '/suhctm/RefillPhone.php');
+require_once(BASE_HELPER_RAPI_PATH . '/suhctm/RefillCallBack.php');
+require_once(BASE_HELPER_RAPI_PATH . '/suhcpdd/RefillOil.php');
+require_once(BASE_HELPER_RAPI_PATH . '/suhcpdd/RefillPhone.php');
+require_once(BASE_HELPER_RAPI_PATH . '/suhcpdd/RefillCallBack.php');
+require_once(BASE_HELPER_RAPI_PATH . '/beixt/RefillPhone.php');
+require_once(BASE_HELPER_RAPI_PATH . '/beixt/RefillCallBack.php');
+require_once(BASE_HELPER_RAPI_PATH . '/bxtwt/RefillPhone.php');
+require_once(BASE_HELPER_RAPI_PATH . '/bxtwt/RefillCallBack.php');
+require_once(BASE_HELPER_RAPI_PATH . '/bjb/RefillPhone.php');
+require_once(BASE_HELPER_RAPI_PATH . '/bjb/RefillCallBack.php');
+require_once(BASE_HELPER_RAPI_PATH . '/bdt/RefillPhone.php');
+require_once(BASE_HELPER_RAPI_PATH . '/bdt/RefillCallBack.php');
+require_once(BASE_HELPER_RAPI_PATH . '/zzx/RefillOil.php');
+require_once(BASE_HELPER_RAPI_PATH . '/zzx/RefillPhone.php');
+require_once(BASE_HELPER_RAPI_PATH . '/zzx/RefillCallBack.php');
+require_once(BASE_HELPER_RAPI_PATH . '/lx/RefillOil.php');
+require_once(BASE_HELPER_RAPI_PATH . '/lx/RefillPhone.php');
+require_once(BASE_HELPER_RAPI_PATH . '/lx/RefillCallBack.php');
+require_once(BASE_HELPER_RAPI_PATH . '/saihu/RefillOil.php');
+require_once(BASE_HELPER_RAPI_PATH . '/saihu/RefillPhone.php');
+require_once(BASE_HELPER_RAPI_PATH . '/saihu/RefillCallBack.php');
+require_once(BASE_HELPER_RAPI_PATH . '/yifa/RefillPhone.php');
+require_once(BASE_HELPER_RAPI_PATH . '/yifa/RefillCallBack.php');
+require_once(BASE_HELPER_RAPI_PATH . '/jiec/RefillPhone.php');
+require_once(BASE_HELPER_RAPI_PATH . '/jiec/RefillCallBack.php');
+require_once(BASE_HELPER_RAPI_PATH . '/xc/RefillPhone.php');
+require_once(BASE_HELPER_RAPI_PATH . '/xc/RefillCallBack.php');
+require_once(BASE_HELPER_RAPI_PATH . '/gftd/RefillOil.php');
+require_once(BASE_HELPER_RAPI_PATH . '/gftd/RefillCallBack.php');
+require_once(BASE_HELPER_RAPI_PATH . '/gftdsinop/RefillOil.php');
+require_once(BASE_HELPER_RAPI_PATH . '/gftdsinop/RefillCallBack.php');
+require_once(BASE_HELPER_RAPI_PATH . '/weit/RefillPhone.php');
+require_once(BASE_HELPER_RAPI_PATH . '/weit/RefillCallBack.php');
+require_once(BASE_HELPER_RAPI_PATH . '/bjbyd/RefillPhone.php');
+require_once(BASE_HELPER_RAPI_PATH . '/bjbyd/RefillCallBack.php');
+require_once(BASE_HELPER_RAPI_PATH . '/tianx/RefillPhone.php');
+require_once(BASE_HELPER_RAPI_PATH . '/tianx/RefillCallBack.php');
+require_once(BASE_HELPER_RAPI_PATH . '/afand/RefillPhone.php');
+require_once(BASE_HELPER_RAPI_PATH . '/afand/RefillCallBack.php');
+require_once(BASE_HELPER_RAPI_PATH . '/afandeng/RefillPhone.php');
+require_once(BASE_HELPER_RAPI_PATH . '/afandeng/RefillCallBack.php');
+//require_once(BASE_HELPER_RAPI_PATH . '/tongy/RefillPhone.php');
+//require_once(BASE_HELPER_RAPI_PATH . '/tongy/RefillCallBack.php');

+ 40 - 0
helper/refill/api/yl/bailian/RefillCallBack.php

@@ -0,0 +1,40 @@
+<?php
+namespace refill\bailian;
+
+require_once(BASE_HELPER_RAPI_PATH . '/bailian/config.php');
+use Log;
+use refill;
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $input = $params;
+        unset($input['sign']);
+        $sign = config::sign($input);
+        if ($params['sign'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    public function notify($params)
+    {
+        $status = $params['status'];
+        $order_sn = $params['orderId'];
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false,false];
+        }
+
+        $order_id = $order_info['order_id'];
+        if ($status === 'Success') {
+            Model('refill_order')->edit($order_id, ['official_sn' => $params['voucher']]);
+            return [$order_id, true, false, true];
+        } elseif ($status === 'Fail') {
+            return [$order_id, false, true, true];
+        } else {
+            return [$order_id, false, false, false];
+        }
+    }
+}

+ 132 - 0
helper/refill/api/yl/bailian/RefillOil.php

@@ -0,0 +1,132 @@
+<?php
+
+namespace refill\bailian;
+
+require_once(BASE_HELPER_RAPI_PATH . '/bailian/config.php');
+
+use refill;
+use Log;
+
+class RefillOil extends refill\IRefillOil
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount, int $card_type, string $order_sn)
+    {
+        $params['time'] = time();
+        $params['macid'] = config::MAC_ID;
+        $params['account'] = $phone;
+        $params['macpid'] = config::PRODUCT[$card_type][$amount];
+        $params['orderid'] = $order_sn;
+        $params['noticeurl'] = config::NOTIFY_URL;
+        $params['count'] = 1;
+        return $params;
+    }
+
+    public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
+    {
+        $order_sn = $params['order_sn'];
+        $params = $this->req_params($card_no, $amount, $card_type, $order_sn);
+        if(empty($params['macpid'])) {
+            return [false, '商品编号错误', false];
+        }
+        $sign = config::sign($params);
+        $params['sign'] = $sign;
+
+        $resp = http_request(config::ORDER_URL, $params, 'POST', false, config::ExtHeaders, $net_errno);
+
+        if (empty($resp)) {
+            return [false, '网络错误', true];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            $code = $resp['errCode'];
+            if (empty($resp)) {
+                return [false, '网络错误', true];
+            } elseif ($code === '0') {
+                return [true, $resp['orderId'], false];
+            } elseif (in_array($code, [5, 6], true)) {
+                $net_errno = "HTTP-{$code}";
+                return [false, '查-'.$resp['errInfo'], true];
+            } else {
+                return [false, $resp['errInfo'], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['time'] = time();
+        $params['macid'] = config::MAC_ID;
+        $params['id'] = $refill_info['order_sn'];
+        $params['sign'] = config::sign($params);
+
+        $resp = http_request(config::QUERY_URL, $params, 'GET');
+
+        if (empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            }
+            elseif ($resp['errCode'] === 0)
+            {
+                $status = $resp['orderStatus'];
+                if ($status === 1) {
+                    Model('refill_order')->edit($refill_info['order_id'], ['official_sn' => $resp['data']['voucher']]);
+                    $order_state = ORDER_STATE_SUCCESS;
+                } elseif ($status === 2) {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif ($status === 3) {
+                    $order_state = ORDER_STATE_SEND;
+                } else {
+                    return [false, $status];
+                }
+
+                return [true, $order_state];
+            }
+            elseif ($resp['errCode'] === 4 && (time() - $refill_info['commit_time'] >= 600))
+            {
+                return [true, ORDER_STATE_NOEXIST];
+            }
+            else
+            {
+                return [false, $resp['errInfo']];
+            }
+        }
+    }
+
+    public function balance()
+    {
+        $params['time'] = time();
+        $params['macid'] = config::MAC_ID;
+        $params['sign'] = config::sign($params);
+
+        $resp = http_request(config::BALANCE_URL, $params, 'GET');
+
+        if (empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            } elseif ($resp['errCode'] === 0) {
+                return [true, $resp['data']['balance']];
+            } else {
+                return [false, $resp['errInfo']];
+            }
+        }
+    }
+}

+ 48 - 0
helper/refill/api/yl/bailian/config.php

@@ -0,0 +1,48 @@
+<?php
+
+namespace refill\bailian;
+
+use mtopcard;
+
+class config
+{
+    const ORDER_URL = 'http://101.37.252.250/cg/api/Owned/Charge';
+    const QUERY_URL = 'http://101.37.252.250/cg/api/Owned/Query';
+    const BALANCE_URL = 'http://101.37.252.250/cg/api/MacInfo/Balance';
+
+    const MAC_ID = '1646476170480002';
+    const KEY = 'ffcb6768ad0a8b631acd29355a31b50d';
+    const NOTIFY_URL = BASE_SITE_URL . "/mobile/callback/refill_bailian.php";
+    const PRODUCT = [
+        mtopcard\SinopecCard => [
+            500 => 100004,
+            1000 => 100005
+        ]
+    ];
+    const ExtHeaders = ['Content-Type:application/x-www-form-urlencoded;charset=utf-8'];
+
+    public static function sign($params)
+    {
+        ksort($params);
+        $content = '';
+        foreach ($params as $key => $value) {
+            if(self::check_empty($value) === false) {
+                $content .= "{$key}{$value}";
+            }
+        }
+        $content .= config::KEY;
+        return md5($content);
+    }
+
+    public static function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+}

+ 14 - 0
helper/refill/api/yl/bailian/开户信息.txt

@@ -0,0 +1,14 @@
+api地址
+下单接口:http://101.37.252.250/cg/api/Owned/Charge
+查询接口:http://101.37.252.250/cg/api/Owned/Query
+余额查询接口:http://101.37.252.250/cg/api/MacInfo/Balance
+
+
+工号:1646476170480002
+密钥:ffcb6768ad0a8b631acd29355a31b50d
+
+
+管理后台:
+http://101.37.252.250/cg/v/#/home
+账号:yezi
+密码:836296

+ 67 - 0
helper/refill/api/yl/baixuan/RefillCallBack.php

@@ -0,0 +1,67 @@
+<?php
+namespace refill\baixuan;
+
+require_once(BASE_HELPER_RAPI_PATH . '/baixuan/config.php');
+
+use refill;
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $input = $params;
+        unset($input['sign']);
+        $sign = $this->sign($input);
+        if ($params['sign'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        $params['appSecret'] = config::APP_SECRET;
+        ksort($params);
+        $content = '';
+        foreach ($params as $key => $value) {
+            if($this->check_empty($value) === false) {
+                $content .= "{$key}={$value}&";
+            }
+        }
+        $content = rtrim($content, '&');
+        return md5($content);
+    }
+
+    private function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['orderStatus']);
+        $order_sn = $params['outOrderId'];
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false,false];
+        }
+
+        $order_id = $order_info['order_id'];
+        if ($status === 2) {
+            $data['official_sn'] = strtolower($params['ext1']) == 'null' ? '' : $params['ext1'];
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false, true];
+        } elseif ($status === 3) {
+            return [$order_id, false, true, true];
+        } else {
+            return [$order_id, false, false, false];
+        }
+    }
+}

+ 155 - 0
helper/refill/api/yl/baixuan/RefillPhone.php

@@ -0,0 +1,155 @@
+<?php
+
+namespace refill\baixuan;
+
+require_once(BASE_HELPER_RAPI_PATH . '/baixuan/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount, int $card_type, string $order_sn)
+    {
+        $params['appId'] = config::APP_ID;
+        $params['outOrderId'] = $order_sn;
+        $params['uuid'] = $phone;
+        $params['itemId'] = config::PRODUCT[$card_type][$amount];
+        $params['itemFace'] = $amount;
+        $params['callbackUrl'] = config::NOTIFY_URL;
+        $params['timestamp'] = date("YmdHis").$this->get_millisecond();
+        return $params;
+    }
+
+    public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
+    {
+        $order_sn = $params['order_sn'];
+        $params = $this->req_params($card_no, $amount, $card_type, $order_sn);
+        if(empty($params['itemId'])) {
+            return [false, '商品编号错误', false];
+        }
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+
+        $resp = http_request(config::ORDER_URL, $params, 'POST', false, config::ExtHeaders, $net_errno);
+
+        if (empty($resp)) {
+            return [false, '网络错误', true];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误', true];
+            } elseif ($resp['code'] === '00') {
+                return [true, $resp['orderId'], false];
+            } elseif (in_array($resp['code'], config::ERRCODES, true)) {
+                return [false, $resp['msg'], false];
+            } elseif (in_array($resp['code'], ['-22', '-23', '-99'], true)) {
+                $net_errno = "HTTP-{$resp['code']}";
+                return [false, $resp['msg'], true];
+            } else {
+                $net_errno = "HTTP-998";
+                return [false, $resp['msg'], true];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['appId'] = config::APP_ID;
+        $params['outOrderId'] = $refill_info['order_sn'];
+        $params['timestamp'] = date("YmdHis").$this->get_millisecond();
+        $params['sign'] = $this->sign($params);
+
+        $resp = http_request(config::QUERY_URL, $params, 'POST', false, config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            }
+            elseif ($resp['code'] === '00')
+            {
+                $status = $resp['orderStatus'];
+                if ($status === '2') {
+                    $updata['official_sn'] = $resp['ext1'];
+                    Model('refill_order')->edit($refill_info['order_id'], $updata);
+                    $order_state = ORDER_STATE_SUCCESS;
+                } elseif ($status === '3') {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif ($status === '1') {
+                    $order_state = ORDER_STATE_SEND;
+                } elseif ($status === '4' && (time() - $refill_info['commit_time'] >= 600)) {
+                    $order_state = ORDER_STATE_NOEXIST;
+                } else {
+                    return [false, $resp['msg']];
+                }
+                return [true, $order_state];
+            }
+            else
+            {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+    public function balance()
+    {
+        $params['appId'] = config::APP_ID;
+        $params['timestamp'] = date("YmdHis").$this->get_millisecond();
+        $params['sign'] = $this->sign($params);
+
+        $resp = http_request(config::BALANCE_URL, $params, 'POST', false, config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            } elseif ($resp['code'] === '00') {
+                return [true, $resp['balance']];
+            } else {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+    /**
+     * 获取毫秒级别的时间戳
+     */
+    private function get_millisecond()
+    {
+        list($usec, $sec) = explode(" ", microtime());
+        return round($usec*1000);
+    }
+
+    private function sign($params)
+    {
+        $params['appSecret'] = config::APP_SECRET;
+        ksort($params);
+        $content = '';
+        foreach ($params as $key => $value) {
+            if($this->check_empty($value) === false) {
+                $content .= "{$key}={$value}&";
+            }
+        }
+        $content = rtrim($content, '&');
+        return md5($content);
+    }
+}

+ 44 - 0
helper/refill/api/yl/baixuan/config.php

@@ -0,0 +1,44 @@
+<?php
+
+
+namespace refill\baixuan;
+
+use mtopcard;
+class config
+{
+    const ORDER_URL = 'http://119.23.174.34:8911/api/hf/order/submit';
+    const QUERY_URL = 'http://119.23.174.34:8911/api/order/query';
+    const BALANCE_URL = 'http://119.23.174.34:8911/api/account/balance';
+
+    const APP_ID = 'Hs2pvfcPTK';
+    const APP_SECRET = 'WYUvuzPpFNnBfQZm';
+    const NOTIFY_URL = BASE_SITE_URL . "/mobile/callback/refill_baixuan.php";
+    const PRODUCT = [
+        mtopcard\ChinaMobileCard => [
+            30  => 100067,
+            50  => 100025,
+            100 => 100026,
+            200 => 100027,
+            300 => 100028,
+            500 => 100029,
+        ],
+        mtopcard\ChinaUnicomCard => [
+            30  => 100086,
+            50  => 100087,
+            100 => 100088,
+            200 => 100090,
+            300 => 100091,
+            500 => 100089,
+        ],
+        mtopcard\ChinaTelecomCard => [
+            30  => 100062,
+            50  => 100022,
+            100 => 100023,
+            200 => 100024,
+            300 => 100084,
+            500 => 100085,
+        ],
+    ];
+    const ExtHeaders = ['Content-Type:application/x-www-form-urlencoded;charset=utf-8'];
+    const ERRCODES = ['-10', '-12', '-13', '-14', '-15', '-16', '-18', '-21'];
+}

+ 20 - 0
helper/refill/api/yl/baixuan/商品编码.txt

@@ -0,0 +1,20 @@
+高价移动30          100067
+高价移动50          100025
+高价移动100         100026
+高价移动200         100027
+高价移动300         100028
+高价移动500         100029
+
+高价联通30          100086
+高价联通50          100087
+高价联通100         100088
+高价联通300         100090
+高价联通500         100091
+高价联通200         100089
+
+高价电信30          100062
+高价电信50          100022
+高价电信100         100023
+高价电信200         100024
+高价电信300         100084
+高价电信500         100085

+ 13 - 0
helper/refill/api/yl/baixuan/开户信息.txt

@@ -0,0 +1,13 @@
+后台地址:http://119.23.174.34:8888
+帐号:YZ02
+密码:717750
+二级密码:nKyQ2049
+appId:Hs2pvfcPTK
+appSecret:WYUvuzPpFNnBfQZm
+后台-商品列表,可查看已配置商品信息
+后台-安全中心,可配置IP白名单
+接口文档:https://www.showdoc.com.cn/1686453783298366/7925312871840290
+下单接口地址:http://119.23.174.34:8911/api/hf/order/submit
+查单接口地址:http://119.23.174.34:8911/api/order/query
+余额接口地址:http://119.23.174.34:8911/api/account/balance
+提卡接口地址:http://119.23.174.34:8911/api/card/get

+ 67 - 0
helper/refill/api/yl/baixuan_normal/RefillCallBack.php

@@ -0,0 +1,67 @@
+<?php
+namespace refill\baixuan_normal;
+
+require_once(BASE_HELPER_RAPI_PATH . '/baixuan_normal/config.php');
+
+use refill;
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $input = $params;
+        unset($input['sign']);
+        $sign = $this->sign($input);
+        if ($params['sign'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        $params['appSecret'] = config::APP_SECRET;
+        ksort($params);
+        $content = '';
+        foreach ($params as $key => $value) {
+            if($this->check_empty($value) === false) {
+                $content .= "{$key}={$value}&";
+            }
+        }
+        $content = rtrim($content, '&');
+        return md5($content);
+    }
+
+    private function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['orderStatus']);
+        $order_sn = $params['outOrderId'];
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false,false];
+        }
+
+        $order_id = $order_info['order_id'];
+        if ($status === 2) {
+            $data['official_sn'] = strtolower($params['ext1']) == 'null' ? '' : $params['ext1'];
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false, true];
+        } elseif ($status === 3) {
+            return [$order_id, false, true, true];
+        } else {
+            return [$order_id, false, false, false];
+        }
+    }
+}

+ 155 - 0
helper/refill/api/yl/baixuan_normal/RefillPhone.php

@@ -0,0 +1,155 @@
+<?php
+
+namespace refill\baixuan_normal;
+
+require_once(BASE_HELPER_RAPI_PATH . '/baixuan_normal/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount, int $card_type, string $order_sn)
+    {
+        $params['appId'] = config::APP_ID;
+        $params['outOrderId'] = $order_sn;
+        $params['uuid'] = $phone;
+        $params['itemId'] = config::PRODUCT[$card_type][$amount];
+        $params['itemFace'] = $amount;
+        $params['callbackUrl'] = config::NOTIFY_URL;
+        $params['timestamp'] = date("YmdHis").$this->get_millisecond();
+        return $params;
+    }
+
+    public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
+    {
+        $order_sn = $params['order_sn'];
+        $params = $this->req_params($card_no, $amount, $card_type, $order_sn);
+        if(empty($params['itemId'])) {
+            return [false, '商品编号错误', false];
+        }
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+
+        $resp = http_request(config::ORDER_URL, $params, 'POST', false, config::ExtHeaders, $net_errno);
+
+        if (empty($resp)) {
+            return [false, '网络错误', true];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误', true];
+            } elseif ($resp['code'] === '00') {
+                return [true, $resp['orderId'], false];
+            } elseif (in_array($resp['code'], config::ERRCODES, true)) {
+                return [false, $resp['msg'], false];
+            } elseif (in_array($resp['code'], ['-22', '-23', '-99'], true)) {
+                $net_errno = "HTTP-{$resp['code']}";
+                return [false, $resp['msg'], true];
+            } else {
+                $net_errno = "HTTP-998";
+                return [false, $resp['msg'], true];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['appId'] = config::APP_ID;
+        $params['outOrderId'] = $refill_info['order_sn'];
+        $params['timestamp'] = date("YmdHis").$this->get_millisecond();
+        $params['sign'] = $this->sign($params);
+
+        $resp = http_request(config::QUERY_URL, $params, 'POST', false, config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            }
+            elseif ($resp['code'] === '00')
+            {
+                $status = $resp['orderStatus'];
+                if ($status === '2') {
+                    $updata['official_sn'] = $resp['ext1'];
+                    Model('refill_order')->edit($refill_info['order_id'], $updata);
+                    $order_state = ORDER_STATE_SUCCESS;
+                } elseif ($status === '3') {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif ($status === '1') {
+                    $order_state = ORDER_STATE_SEND;
+                } elseif ($status === '4' && (time() - $refill_info['commit_time'] >= 600)) {
+                    $order_state = ORDER_STATE_NOEXIST;
+                } else {
+                    return [false, $resp['msg']];
+                }
+                return [true, $order_state];
+            }
+            else
+            {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+    public function balance()
+    {
+        $params['appId'] = config::APP_ID;
+        $params['timestamp'] = date("YmdHis").$this->get_millisecond();
+        $params['sign'] = $this->sign($params);
+
+        $resp = http_request(config::BALANCE_URL, $params, 'POST', false, config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            } elseif ($resp['code'] === '00') {
+                return [true, $resp['balance']];
+            } else {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+    /**
+     * 获取毫秒级别的时间戳
+     */
+    private function get_millisecond()
+    {
+        list($usec, $sec) = explode(" ", microtime());
+        return round($usec*1000);
+    }
+
+    private function sign($params)
+    {
+        $params['appSecret'] = config::APP_SECRET;
+        ksort($params);
+        $content = '';
+        foreach ($params as $key => $value) {
+            if($this->check_empty($value) === false) {
+                $content .= "{$key}={$value}&";
+            }
+        }
+        $content = rtrim($content, '&');
+        return md5($content);
+    }
+}

+ 40 - 0
helper/refill/api/yl/baixuan_normal/config.php

@@ -0,0 +1,40 @@
+<?php
+
+
+namespace refill\baixuan_normal;
+
+use mtopcard;
+class config
+{
+    const ORDER_URL = 'http://119.23.174.34:8911/api/hf/order/submit';
+    const QUERY_URL = 'http://119.23.174.34:8911/api/order/query';
+    const BALANCE_URL = 'http://119.23.174.34:8911/api/account/balance';
+
+    const APP_ID = 'ntzRlj2kNV';
+    const APP_SECRET = 'HgQoSMSvolLaMZWV';
+    const NOTIFY_URL = BASE_SITE_URL . "/mobile/callback/refill_baixuan_normal.php";
+    const PRODUCT = [
+        mtopcard\ChinaMobileCard => [
+            30  => 100067,
+            50  => 100025,
+            100 => 100026,
+            200 => 100027,
+            300 => 100028,
+            500 => 100029
+        ],
+        mtopcard\ChinaUnicomCard => [
+            30  => 100011,
+            50  => 100012,
+            100 => 100013,
+            200 => 100014
+        ],
+        mtopcard\ChinaTelecomCard => [
+            30  => 100015,
+            50  => 100016,
+            100 => 100017,
+            200 => 100018
+        ],
+    ];
+    const ExtHeaders = ['Content-Type:application/x-www-form-urlencoded;charset=utf-8'];
+    const ERRCODES = ['-10', '-12', '-13', '-14', '-15', '-16', '-18', '-21'];
+}

+ 16 - 0
helper/refill/api/yl/baixuan_normal/商品编码.txt

@@ -0,0 +1,16 @@
+高价移动30         100067
+高价移动50         100025
+高价移动100        100026
+高价移动200        100027
+高价移动300        100028
+高价移动500        100029
+
+联通30          100011
+联通50          100012
+联通100         100013
+联通200         100014
+
+电信30          100015
+电信50          100016
+电信100         100017
+电信200         100018

+ 13 - 0
helper/refill/api/yl/baixuan_normal/开户信息.txt

@@ -0,0 +1,13 @@
+后台地址:http://119.23.174.34:8888
+帐号:YZ01
+密码:279391
+二级密码:dpjl5582
+appId:ntzRlj2kNV
+appSecret:HgQoSMSvolLaMZWV
+后台-商品列表,可查看已配置商品信息
+后台-安全中心,可配置IP白名单
+接口文档:https://www.showdoc.com.cn/1686453783298366/7925312871840290
+下单接口地址:http://119.23.174.34:8911/api/hf/order/submit
+查单接口地址:http://119.23.174.34:8911/api/order/query
+余额接口地址:http://119.23.174.34:8911/api/account/balance
+提卡接口地址:http://119.23.174.34:8911/api/card/get

+ 48 - 0
helper/refill/api/yl/baixuannew_high/RefillCallBack.php

@@ -0,0 +1,48 @@
+<?php
+namespace refill\baixuannew_high;
+
+require_once(BASE_HELPER_RAPI_PATH . '/baixuannew_high/config.php');
+
+use refill;
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $sign = $this->sign($params);
+        if ($params['sign'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        $userid = config::USER_ID;
+        $key = config::KEY;
+        $content = "userid={$userid}&orderid={$params['orderid']}&sporderid={$params['sporderid']}&merchantsubmittime={$params['merchantsubmittime']}";
+        $content .= "&resultno={$params['resultno']}&key={$key}";
+        return strtoupper(md5($content));
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['resultno']);
+        $order_sn = $params['sporderid'];
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false,false];
+        }
+
+        $order_id = $order_info['order_id'];
+        if ($status === 1) {
+            $data['official_sn'] = strtolower($params['remark1']) == 'null' ? '' : $params['remark1'];
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false, true];
+        } elseif ($status === 9) {
+            return [$order_id, false, true, true];
+        } else {
+            return [$order_id, false, false, false];
+        }
+    }
+}

+ 155 - 0
helper/refill/api/yl/baixuannew_high/RefillPhone.php

@@ -0,0 +1,155 @@
+<?php
+
+namespace refill\baixuannew_high;
+
+require_once(BASE_HELPER_RAPI_PATH . '/baixuannew_high/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount, $card_type, string $order_sn)
+    {
+        $params['userid'] = config::USER_ID;
+        $params['productid'] = config::ProductIdS[$card_type][$amount];
+        $params['price'] = $amount;
+        $params['num'] = 1;
+        $params['mobile'] = $phone;
+        $params['spordertime'] = date("YmdHis");
+        $params['sporderid'] = $order_sn;
+        $params['back_url'] = config::NOTIFY_URL;
+        $params['paytype'] = config::operator[$card_type];
+
+        return $params;
+    }
+
+    public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
+    {
+        $order_sn = $params['order_sn'];
+        $params = $this->req_params($card_no, $amount, $card_type, $order_sn);
+
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+
+        $resp = http_request(config::ORDER_URL, $params, 'POST', false, config::ExtHeaders, $net_errno);
+
+        if (empty($resp)) {
+            return [false, '网络错误', true];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = $this->xmlToArray($resp);
+            if (empty($resp)) {
+                return [false, '网络错误', true];
+            }
+
+            $resultno = $resp['resultno'];
+            if (in_array($resultno, ['0', '2'], true)) {
+                return [true, $resp['orderid'], false];
+            } elseif (in_array($resultno, config::ERR_NOS, true)) {
+                return [false, $resultno, false];
+            } elseif ($resultno === '9999' || $resultno === '5006') {
+                $net_errno = "HTTP-{$resultno}";
+                return [false, $resultno, true];
+            } else {
+                //未知结果码
+                $err = 998;
+                $net_errno = "HTTP-{$err}";
+                return [false, $resultno, true];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['userid'] = config::USER_ID;
+        $params['sporderid'] = $refill_info['order_sn'];
+        $key = config::KEY;
+        $content = "userid={$params['userid']}&sporderid={$params['sporderid']}&key={$key}";
+        $params['sign'] = strtoupper(md5($content));
+
+        $resp = http_request(config::QUERY_URL, $params, 'POST', false, config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = $this->xmlToArray($resp);
+            if (empty($resp))
+            {
+                return [false, '网络错误'];
+            }
+            else
+            {
+                $resultno = $resp['resultno'];
+                if ($resultno === '1') {
+                    $updata['official_sn'] = $resp['remark1'];
+                    Model('refill_order')->edit($refill_info['order_id'], $updata);
+                    $order_state = ORDER_STATE_SUCCESS;
+                } elseif ($resultno === '9') {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif (in_array($resultno, ['0','2'], true)) {
+                    $order_state = ORDER_STATE_SEND;
+                } elseif ($resultno === '5007' && (time() - $refill_info['commit_time'] > 600)) {
+                    $order_state = ORDER_STATE_NOEXIST;
+                } else {
+                    return [false, $resultno];
+                }
+
+                return [true, $order_state];
+            }
+        }
+    }
+
+    public function balance()
+    {
+        $params['userid'] = config::USER_ID;
+        $key = config::KEY;
+        $content = "userid={$params['userid']}&key={$key}";
+        $params['sign'] = strtoupper(md5($content));
+
+        $resp = http_request(config::BALANCE_URL, $params, 'POST', false, config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = $this->xmlToArray($resp);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            } elseif ($resp['resultno'] === '1') {
+                return [true, $resp['balance']];
+            } else {
+                return [false, $resp['resultno']];
+            }
+        }
+    }
+
+    private function sign($params)
+    {
+        $userid = config::USER_ID;
+        $key = config::KEY;
+        $content = "userid={$userid}&productid={$params['productid']}&price={$params['price']}&num={$params['num']}&mobile={$params['mobile']}&spordertime={$params['spordertime']}";
+        $content .= "&sporderid={$params['sporderid']}&key={$key}";
+        return strtoupper(md5($content));
+    }
+
+    public function xmlToArray($xml)
+    {
+        $replace_str = str_replace(' ','','encoding="gb2312"');
+        $xml = mb_convert_encoding($xml,"UTF-8","gb2312");
+        $xml = str_replace($replace_str, "encoding='utf-8'", $xml);
+        return refill\util::xmlToArray($xml);
+    }
+}

+ 56 - 0
helper/refill/api/yl/baixuannew_high/config.php

@@ -0,0 +1,56 @@
+<?php
+
+
+namespace refill\baixuannew_high;
+
+use mtopcard;
+class config
+{
+    //https://www.showdoc.com.cn/AQL666666/
+    const ORDER_URL = 'http://118.31.38.142:9086/onlinepay.do';
+    const QUERY_URL= 'http://118.31.38.142:9086/searchpay.do';
+    const BALANCE_URL = 'http://118.31.38.142:9086/searchbalance.do';
+
+    const USER_ID= '10002504';
+    const KEY = 'T8JBHZyHGziF2A3AtM5tDesWtb73MRCX';
+    const NOTIFY_URL = BASE_SITE_URL . "/mobile/callback/refill_baixuannew_high.php";
+    const operator = [
+        mtopcard\ChinaMobileCard  => 'yd',
+        mtopcard\ChinaUnicomCard  => 'lt',
+        mtopcard\ChinaTelecomCard => 'dx'
+    ];
+    const ERR_NOS = [
+        '5001','5002','5003','5004','5005','5008','5009','5010','5011','5012'
+    ];
+    const ExtHeaders = ['Content-Type:application/x-www-form-urlencoded;'];
+
+    const ProductIdS = [
+        mtopcard\ChinaMobileCard =>
+            [
+                30  => '101687',
+                50  => '101688',
+                100 => '101689',
+                200 => '101690',
+                300 => '101691',
+                500 => '101692',
+            ],
+        mtopcard\ChinaUnicomCard =>
+            [
+                30  => '101705',
+                50  => '101706',
+                100 => '101707',
+                200 => '101708',
+                300 => '101709',
+                500 => '101710',
+            ],
+        mtopcard\ChinaTelecomCard =>
+            [
+                30  => '101723',
+                50  => '101724',
+                100 => '101725',
+                200 => '101726',
+                300 => '101727',
+                500 => '101728',
+            ]
+    ];
+}

+ 29 - 0
helper/refill/api/yl/baixuannew_high/对接文档-yezi.txt

@@ -0,0 +1,29 @@
+登录地址:http://118.31.38.142:7080/
+账号:YZ01
+密码:W3yet5aWmR
+ID:10002504
+秘钥:T8JBHZyHGziF2A3AtM5tDesWtb73MRCX
+下单地址:
+http://118.31.38.142:9086/onlinepay.do
+余额查询:
+http://118.31.38.142:9086/searchbalance.do
+订单主动查询地址:
+http://118.31.38.142:9086/searchpay.do
+api接口文档地址:
+https://www.showdoc.com.cn/AQL666666/
+
+
+101687	全国移动话费30元直充
+101688	全国移动话费50元直充
+101689	全国移动话费100元直充
+101690	全国移动话费200元直充
+
+101723  全国电信话费30元直充
+101724  全国电信话费50元直充
+101725	全国电信话费100元直充
+101726	全国电信话费200元直充
+
+101705	全国联通话费30元直充
+101706	全国联通话费50元直充
+101707	全国联通话费100元直充
+101708	全国联通话费200元直充

+ 48 - 0
helper/refill/api/yl/baixuannew_normal/RefillCallBack.php

@@ -0,0 +1,48 @@
+<?php
+namespace refill\baixuannew_normal;
+
+require_once(BASE_HELPER_RAPI_PATH . '/baixuannew_normal/config.php');
+
+use refill;
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $sign = $this->sign($params);
+        if ($params['sign'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        $userid = config::USER_ID;
+        $key = config::KEY;
+        $content = "userid={$userid}&orderid={$params['orderid']}&sporderid={$params['sporderid']}&merchantsubmittime={$params['merchantsubmittime']}";
+        $content .= "&resultno={$params['resultno']}&key={$key}";
+        return strtoupper(md5($content));
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['resultno']);
+        $order_sn = $params['sporderid'];
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false,false];
+        }
+
+        $order_id = $order_info['order_id'];
+        if ($status === 1) {
+            $data['official_sn'] = strtolower($params['remark1']) == 'null' ? '' : $params['remark1'];
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false, true];
+        } elseif ($status === 9) {
+            return [$order_id, false, true, true];
+        } else {
+            return [$order_id, false, false, false];
+        }
+    }
+}

+ 155 - 0
helper/refill/api/yl/baixuannew_normal/RefillPhone.php

@@ -0,0 +1,155 @@
+<?php
+
+namespace refill\baixuannew_normal;
+
+require_once(BASE_HELPER_RAPI_PATH . '/baixuannew_normal/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount, $card_type, string $order_sn)
+    {
+        $params['userid'] = config::USER_ID;
+        $params['productid'] = config::ProductIdS[$card_type][$amount];
+        $params['price'] = $amount;
+        $params['num'] = 1;
+        $params['mobile'] = $phone;
+        $params['spordertime'] = date("YmdHis");
+        $params['sporderid'] = $order_sn;
+        $params['back_url'] = config::NOTIFY_URL;
+        $params['paytype'] = config::operator[$card_type];
+
+        return $params;
+    }
+
+    public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
+    {
+        $order_sn = $params['order_sn'];
+        $params = $this->req_params($card_no, $amount, $card_type, $order_sn);
+
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+
+        $resp = http_request(config::ORDER_URL, $params, 'POST', false, config::ExtHeaders, $net_errno);
+
+        if (empty($resp)) {
+            return [false, '网络错误', true];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = $this->xmlToArray($resp);
+            if (empty($resp)) {
+                return [false, '网络错误', true];
+            }
+
+            $resultno = $resp['resultno'];
+            if (in_array($resultno, ['0', '2'], true)) {
+                return [true, $resp['orderid'], false];
+            } elseif (in_array($resultno, config::ERR_NOS, true)) {
+                return [false, $resultno, false];
+            } elseif ($resultno === '9999' || $resultno === '5006') {
+                $net_errno = "HTTP-{$resultno}";
+                return [false, $resultno, true];
+            } else {
+                //未知结果码
+                $err = 998;
+                $net_errno = "HTTP-{$err}";
+                return [false, $resultno, true];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['userid'] = config::USER_ID;
+        $params['sporderid'] = $refill_info['order_sn'];
+        $key = config::KEY;
+        $content = "userid={$params['userid']}&sporderid={$params['sporderid']}&key={$key}";
+        $params['sign'] = strtoupper(md5($content));
+
+        $resp = http_request(config::QUERY_URL, $params, 'POST', false, config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = $this->xmlToArray($resp);
+            if (empty($resp))
+            {
+                return [false, '网络错误'];
+            }
+            else
+            {
+                $resultno = $resp['resultno'];
+                if ($resultno === '1') {
+                    $updata['official_sn'] = $resp['remark1'];
+                    Model('refill_order')->edit($refill_info['order_id'], $updata);
+                    $order_state = ORDER_STATE_SUCCESS;
+                } elseif ($resultno === '9') {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif (in_array($resultno, ['0','2'], true)) {
+                    $order_state = ORDER_STATE_SEND;
+                } elseif ($resultno === '5007' && (time() - $refill_info['commit_time'] > 600)) {
+                    $order_state = ORDER_STATE_NOEXIST;
+                } else {
+                    return [false, $resultno];
+                }
+
+                return [true, $order_state];
+            }
+        }
+    }
+
+    public function balance()
+    {
+        $params['userid'] = config::USER_ID;
+        $key = config::KEY;
+        $content = "userid={$params['userid']}&key={$key}";
+        $params['sign'] = strtoupper(md5($content));
+
+        $resp = http_request(config::BALANCE_URL, $params, 'POST', false, config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = $this->xmlToArray($resp);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            } elseif ($resp['resultno'] === '1') {
+                return [true, $resp['balance']];
+            } else {
+                return [false, $resp['resultno']];
+            }
+        }
+    }
+
+    private function sign($params)
+    {
+        $userid = config::USER_ID;
+        $key = config::KEY;
+        $content = "userid={$userid}&productid={$params['productid']}&price={$params['price']}&num={$params['num']}&mobile={$params['mobile']}&spordertime={$params['spordertime']}";
+        $content .= "&sporderid={$params['sporderid']}&key={$key}";
+        return strtoupper(md5($content));
+    }
+
+    public function xmlToArray($xml)
+    {
+        $replace_str = str_replace(' ','','encoding="gb2312"');
+        $xml = mb_convert_encoding($xml,"UTF-8","gb2312");
+        $xml = str_replace($replace_str, "encoding='utf-8'", $xml);
+        return refill\util::xmlToArray($xml);
+    }
+}

+ 56 - 0
helper/refill/api/yl/baixuannew_normal/config.php

@@ -0,0 +1,56 @@
+<?php
+
+
+namespace refill\baixuannew_normal;
+
+use mtopcard;
+class config
+{
+    //https://www.showdoc.com.cn/AQL666666/
+    const ORDER_URL = 'http://118.31.38.142:9086/onlinepay.do';
+    const QUERY_URL= 'http://118.31.38.142:9086/searchpay.do';
+    const BALANCE_URL = 'http://118.31.38.142:9086/searchbalance.do';
+
+    const USER_ID= '10002544';
+    const KEY = 'TGP8dMWt3YNN8Hb3Ebzf6fK8X7n6FzmK';
+    const NOTIFY_URL = BASE_SITE_URL . "/mobile/callback/refill_baixuannew_normal.php";
+    const operator = [
+        mtopcard\ChinaMobileCard  => 'yd',
+        mtopcard\ChinaUnicomCard  => 'lt',
+        mtopcard\ChinaTelecomCard => 'dx'
+    ];
+    const ERR_NOS = [
+        '5001','5002','5003','5004','5005','5008','5009','5010','5011','5012'
+    ];
+    const ExtHeaders = ['Content-Type:application/x-www-form-urlencoded;'];
+
+    const ProductIdS = [
+        mtopcard\ChinaMobileCard =>
+            [
+                30  => '101687',
+                50  => '101688',
+                100 => '101689',
+                200 => '101690',
+                300 => '101691',
+                500 => '101692',
+            ],
+        mtopcard\ChinaUnicomCard =>
+            [
+                30  => '101705',
+                50  => '101706',
+                100 => '101707',
+                200 => '101708',
+                300 => '101709',
+                500 => '101710',
+            ],
+        mtopcard\ChinaTelecomCard =>
+            [
+                30  => '101723',
+                50  => '101724',
+                100 => '101725',
+                200 => '101726',
+                300 => '101727',
+                500 => '101728',
+            ]
+    ];
+}

+ 31 - 0
helper/refill/api/yl/baixuannew_normal/对接文档-yezi.txt

@@ -0,0 +1,31 @@
+登录地址:http://118.31.38.142:7080/
+账号:YZ02
+密码:YZ123456
+ID:10002544
+秘钥:TGP8dMWt3YNN8Hb3Ebzf6fK8X7n6FzmK
+下单地址:
+http://118.31.38.142:9086/onlinepay.do
+余额查询:
+http://118.31.38.142:9086/searchbalance.do
+订单主动查询地址:
+http://118.31.38.142:9086/searchpay.do
+api接口文档地址:
+https://www.showdoc.com.cn/AQL666666/
+
+
+101687	全国移动话费30元直充
+101688	全国移动话费50元直充
+101689	全国移动话费100元直充
+101690	全国移动话费200元直充
+
+101723  全国电信话费30元直充
+101724  全国电信话费50元直充
+101725	全国电信话费100元直充
+101726	全国电信话费200元直充
+
+101705	全国联通话费30元直充
+101706	全国联通话费50元直充
+101707	全国联通话费100元直充
+101708	全国联通话费200元直充
+101709	全国联通话费300元直充
+101710	全国联通话费500元直充

+ 75 - 0
helper/refill/api/yl/bdt/RefillCallBack.php

@@ -0,0 +1,75 @@
+<?php
+
+
+namespace refill\bdt;
+
+use refill;
+
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $input = $params;
+        unset($input['sign']);
+
+        $sign = $this->sign($input);
+        if ($params['sign'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+
+    private function sign($params)
+    {
+        ksort($params);
+
+        $body = "";
+        $i = 0;
+        foreach ($params as $k => $v) {
+            if (false === $this->check_empty($v) && "@" != substr($v, 0, 1)) {
+                if ($i == 0) {
+                    $body .= "{$k}" . "=" . urldecode($v);
+                } else {
+                    $body .= "&" . "{$k}" . "=" . urldecode($v);
+                }
+                $i++;
+            }
+        }
+
+        $body .= "&key=" . config::KEY;
+        return strtoupper(md5($body));
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['orderStatus']);
+        $order_sn = $params['cardOwnerOrderNo'];
+
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false];
+        }
+        $order_id = $order_info['order_id'];
+        $data['ch_trade_no'] = $params['orderNo'];
+        Model('refill_order')->edit($order_id, $data);
+        if ($status === 1) {
+            return [$order_id, true, false];
+        } else {
+            //速汇充反馈此时可以提交多次.
+            return [$order_id, false, true];
+        }
+    }
+}

+ 90 - 0
helper/refill/api/yl/bdt/RefillOil.php

@@ -0,0 +1,90 @@
+<?php
+
+
+namespace refill\bdt;
+
+require_once(BASE_HELPER_RAPI_PATH . '/bdt/config.php');
+
+
+use refill;
+use mtopcard;
+use Log;
+
+class RefillOil extends refill\IRefillOil
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(string $card_no,int $card_type,int $amount,array $other)
+    {
+        $params['cardNo'] = $card_no;
+
+        if($card_type == mtopcard\PetroChinaCard) {
+            $params['payType'] = 1001;
+        }
+        elseif($card_type == mtopcard\SinopecCard) {
+            $params['payType'] = 1002;
+        }
+        else {
+            Log::record("RefillOil req_params err params",Log::DEBUG);
+        }
+
+        $params['amount'] = $amount;
+        $params['cardOwnerOrderNo'] = $other['order_sn'];
+        $params['notifyUrl'] = config::NOTIFY_URL;
+        $params['cardOwnerAccount'] = config::CardOwnerAccount;
+        $params['date'] = date("Y-m-d H:i:s");
+        $params['ip'] = config::API_IP;
+
+        return $params;
+    }
+
+    private function sign($params)
+    {
+        $content = '';
+        ksort($params);
+        foreach ($params as $key => $val){
+            $content .= "{$key}={$val}&";
+        }
+        $content .= "key=".config::KEY;
+
+        return strtoupper(md5($content));
+    }
+
+    public function add($card_no,$card_type,$amount,$input,&$net_errno = 0)
+    {
+        $params = $this->req_params($card_no,$card_type,$amount,$input);
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+
+        $resp = http_request(config::ORDER_URL,$params,'POST',false, config::ExtHeaders, $net_errno);
+
+        if (empty($resp)) {
+            return [false,'系统错误',true];
+        }
+        else
+        {
+            Log::record($resp,Log::DEBUG);
+            $resp = json_decode($resp,true);
+            if (empty($resp)) {
+                return [false, '系统错误', true];
+            } elseif ($resp['code'] == 200) {
+                return [true, $resp['msg'], false];
+            } else {
+                return [false, $resp['msg'], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+
+    }
+
+    public function balance()
+    {
+        return [false, '暂无余额接口'];
+    }
+}

+ 24 - 0
helper/refill/api/yl/bdt/RefillPhone.php

@@ -0,0 +1,24 @@
+<?php
+
+
+namespace refill\bdt;
+
+
+use refill\IRefillPhone;
+
+class RefillPhone extends IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    public function add($card_no,$card_type,$amount,$input,&$net_errno = 0)
+    {
+        return [false,'No Implement', false];
+    }
+    public function query($refill_info)
+    {
+        return [false,'No Implement'];
+    }
+}

+ 17 - 0
helper/refill/api/yl/bdt/config.php

@@ -0,0 +1,17 @@
+<?php
+
+
+namespace refill\bdt;
+
+
+class config
+{
+    const ORDER_URL = 'http://137.220.129.53/backend/pay/api/order/createApi';
+
+    const KEY = 'CAL9MNU0819HAB7RL6X5ASK0D32G4018';
+    const CardOwnerAccount = 'stanley';
+
+    const NOTIFY_URL = BASE_SITE_URL . "/mobile/refill_bdt.php";
+    const ExtHeaders = ['Content-Type: application/x-www-form-urlencoded'];
+    const API_IP = NET_IP;
+}

+ 59 - 0
helper/refill/api/yl/beixt/RefillCallBack.php

@@ -0,0 +1,59 @@
+<?php
+
+
+namespace refill\beixt;
+
+require_once(BASE_HELPER_RAPI_PATH . '/beixt/config.php');
+
+
+use refill;
+
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $sign = $this->sign($params);
+        if ($params['sign'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        $body = $params['order_number'];
+        $body .= $params['shipping_status'];
+        $body .= $params['tradeNo'];
+        $body .= config::API_CERT;
+        return strtolower(md5($body));
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['shipping_status']);
+        $order_sn = $params['tradeNo'];
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false,false];
+        }
+
+//0	充值失败
+//1	充值成功
+//2	充值中(非最终结果)
+//3	退款中(充值失败)
+//4	已退款(充值失败)
+//5	充值中未发货(非最终结果)
+//其他	提单成功(非最终结果)
+
+        $order_id = $order_info['order_id'];
+        if ($status === 1) {
+            return [$order_id, true, false,true];
+        }
+        elseif ($status == 0 || $status == 4) {
+            return [$order_id, false, true,true];
+        } else { //status == 3 or status == 5
+            return [$order_id, false, false,false];
+        }
+    }
+}

+ 122 - 0
helper/refill/api/yl/beixt/RefillPhone.php

@@ -0,0 +1,122 @@
+<?php
+namespace refill\beixt;
+
+require_once(BASE_HELPER_RAPI_PATH . '/beixt/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount ,string $order_sn)
+    {
+        $params['phone'] = $phone;
+        $params['product_id'] = $amount;
+        $params['tradeNo'] = $order_sn;
+        $params['notify_url'] = config::NOTIFY_URL;
+
+        return json_encode($params);
+    }
+
+    public function add($card_no, $card_type,$amount,$params,&$net_errno = 0)
+    {
+        $order_sn = $params['order_sn'];
+        $params = $this->req_params($card_no,$amount,$order_sn);
+        $time = time();
+        $api_user_name = config::API_USER_NAME;
+        $sign = $this->sign($time);
+
+        $header = [
+            'Content-Type: application/json',
+            "API-USER-NAME: {$api_user_name}",
+            "API-NAME: OrderCreate",
+            "API-TIMESTAMP: {$time}",
+            "API-SIGNATURE: {$sign}",
+        ];
+        $resp = http_post_data(config::REQUEST_URL,$params,$header,$net_errno);
+
+        if (empty($resp)) {
+            return [false,'系统错误',true];
+        }
+        else
+        {
+            Log::record($resp,Log::DEBUG);
+            $resp = json_decode($resp,true);
+            if (empty($resp)) {
+                return [false, '系统错误', true];
+            } elseif ($resp['ack'] == 'success') {
+                return [true, $resp['message']['order_number'], false];
+            } else {
+                return [false, $resp['message'], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['order_number'] = $refill_info['ch_trade_no'];
+        $params['tradeNo'] = $refill_info['order_sn'];
+
+        $time = time();
+        $api_user_name = config::API_USER_NAME;
+        $sign = $this->sign($time);
+
+        $header = [
+            'Content-Type: application/json',
+            "API-USER-NAME: {$api_user_name}",
+            "API-NAME: OrderQuery",
+            "API-TIMESTAMP: {$time}",
+            "API-SIGNATURE: {$sign}",
+        ];
+
+        $resp = http_post_data(config::REQUEST_URL,json_encode($params),$header);
+
+        if (empty($resp)) {
+            return [false,'系统错误'];
+        }
+        else
+        {
+            Log::record($resp,Log::DEBUG);
+            $resp = json_decode($resp,true);
+            if (empty($resp)) {
+                return [false,'系统错误'];
+            }
+            elseif($resp['ack'] == 'success')
+            {
+                $data = $resp['order'];
+                if ($data['shipping_status'] == 1) {
+                    $order_state = ORDER_STATE_SUCCESS;
+                } elseif (in_array($data['shipping_status'], [0,3,4])) {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif (in_array($data['shipping_status'], [2,5])) {
+                    $order_state = ORDER_STATE_SEND;
+                } else {
+                    return [false, $resp['message']];
+                }
+                return [true, $order_state];
+            }
+            else {
+                return [false,$resp['message']];
+            }
+        }
+    }
+
+    public function balance()
+    {
+        return [false, '暂无余额接口'];
+    }
+
+    private function sign($time)
+    {
+        $ip = config::API_IP;
+        $cert = config::API_CERT;
+        $content = $ip.$time.$cert;
+
+        return md5($content);
+    }
+}

+ 14 - 0
helper/refill/api/yl/beixt/config.php

@@ -0,0 +1,14 @@
+<?php
+
+
+namespace refill\beixt;
+
+
+class config
+{
+    const REQUEST_URL = 'http://8.129.76.127/APIHfKc/v2/';
+    const API_USER_NAME= '2cf54e1fcd1944e102114c56cf9fe4ca';
+    const API_CERT = '2f889d471d2e34a8219dce36e51621c8';
+    const NOTIFY_URL =  BASE_SITE_URL."/mobile/refill_beixt.php";
+    const API_IP = NET_IP;
+}

+ 50 - 0
helper/refill/api/yl/bingdht/RefillCallBack.php

@@ -0,0 +1,50 @@
+<?php
+namespace refill\bingdht;
+
+require_once(BASE_HELPER_RAPI_PATH . '/bingdht/config.php');
+
+use refill;
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $sign = $this->sign($params);
+        if ($params['szVerifyString'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        $userid = config::USER_ID;
+        $key = config::KEY;
+        $content = "szAgentId={$userid}&szOrderId={$params['szOrderId']}&szPhoneNum={$params['szPhoneNum']}&nDemo={$params['nDemo']}&fSalePrice={$params['fSalePrice']}";
+        $content .= "&nFlag={$params['nFlag']}&szKey={$key}";
+        return md5($content);
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['nFlag']);
+        $order_sn = $params['szOrderId'];
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false,false];
+        }
+        $order_id = $order_info['order_id'];
+
+        if ($status === 2) {
+            $data['official_sn'] = strtolower($params['szRtnMsg']) == 'null' ? '' : $params['szRtnMsg'];
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false,true];
+        }
+        elseif ($status === 3) {
+            return [$order_id, false, true,true];
+        }
+        else {
+            return [$order_id, false, false,false];
+        }
+    }
+}

+ 141 - 0
helper/refill/api/yl/bingdht/RefillPhone.php

@@ -0,0 +1,141 @@
+<?php
+
+namespace refill\bingdht;
+
+require_once(BASE_HELPER_RAPI_PATH . '/bingdht/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount, int $card_type, string $order_sn)
+    {
+        $params['szAgentId'] = config::USER_ID;
+        $params['szOrderId'] = $order_sn;
+        $params['szPhoneNum'] = $phone;
+        $params['nMoney'] = $amount;
+        $params['nSortType'] = config::operator[$card_type];
+        $params['nProductClass'] = 1;
+        $params['nProductType'] = 1;
+        $params['szTimeStamp'] = date("Y-m-d H:i:s");
+        $params['szNotifyUrl'] = config::NOTIFY_URL;
+        return $params;
+    }
+
+    public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
+    {
+        $order_sn = $params['order_sn'];
+        $params = $this->req_params($card_no, $amount, $card_type, $order_sn);
+
+        $sign = $this->sign($params);
+        $params['szVerifyString'] = $sign;
+
+        $resp = http_request(config::ORDER_URL, $params, 'POST', false, config::ExtHeaders, $net_errno);
+
+        if (empty($resp)) {
+            return [false, '网络错误', true];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+
+            $nRtn = $resp['nRtn'];
+            if (empty($resp)) {
+                return [false, '网络错误', true];
+            } elseif ($nRtn === 0) {
+                return [true, '', false];
+            } elseif (in_array($nRtn, config::ERR_NOS, true)) {
+                return [false, $resp['szRtnCode'], false];
+            } elseif (in_array($nRtn, [2050, 999], true)) {
+                $net_errno = "HTTP-{$nRtn}";
+                return [false, $resp['szRtnCode'], true];
+            } else {
+                $err = 998;
+                $net_errno = "HTTP-{$err}";
+                return [false, $resp['szRtnCode'], true];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['szAgentId'] = config::USER_ID;
+        $params['szOrderId'] = $refill_info['order_sn'];
+        $key = config::KEY;
+        $content = "szAgentId={$params['szAgentId']}&szOrderId={$params['szOrderId']}&szKey={$key}";
+        $params['szVerifyString'] = md5($content);
+
+        $resp = http_request(config::QUERY_URL, $params, 'POST', false, config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            }
+
+            $status = $resp['nRtn'];
+            if ($status === 5012) {
+                $updata['official_sn'] = $resp['szRtnMsg'];
+                Model('refill_order')->edit($refill_info['order_id'], $updata);
+                $order_state = ORDER_STATE_SUCCESS;
+            } elseif ($status === 5013) {
+                $order_state = ORDER_STATE_CANCEL;
+            } elseif (in_array($status, [5011,5019],true)) {
+                $order_state = ORDER_STATE_SEND;
+            } elseif ($status === 5005 && (time() - $refill_info['commit_time'] >= 300)) {
+                $order_state = ORDER_STATE_NOEXIST;
+            } else {
+                return [false, $resp['szRtnMsg']];
+            }
+
+            return [true, $order_state];
+        }
+    }
+
+    public function balance()
+    {
+        $params['szAgentId'] = config::USER_ID;
+        $key = config::KEY;
+        $content = "szAgentId={$params['szAgentId']}&szKey={$key}";
+        $params['szVerifyString'] = md5($content);
+
+        $resp = http_request(config::BALANCE_URL, $params, 'POST', false, config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            } elseif ($resp['nRtn'] === 0) {
+                return [true, $resp['fBalance']];
+            } else {
+                return [false, $resp['szRtnCode']];
+            }
+        }
+    }
+
+    private function sign($params)
+    {
+        $userid = config::USER_ID;
+        $key = config::KEY;
+        $content = "szAgentId={$userid}&szOrderId={$params['szOrderId']}&szPhoneNum={$params['szPhoneNum']}&nMoney={$params['nMoney']}&nSortType={$params['nSortType']}";
+        $content .= "&nProductClass={$params['nProductClass']}&nProductType={$params['nProductType']}&szTimeStamp={$params['szTimeStamp']}&szKey={$key}";
+        return md5($content);
+    }
+}

+ 11 - 0
helper/refill/api/yl/bingdht/api.txt

@@ -0,0 +1,11 @@
+开发文档:https://docs.qq.com/doc/DWkV1VkxQVk13eEtQ
+
+话费、油卡下单地址:http://116.62.100.67:10186/plat/api/old/submitorder
+查询地址:http://116.62.100.67:10186/plat/api/old/queryorder
+查询余额地址:http://116.62.100.67:10186/plat/api/old/queryBalance
+
+管理端:http://116.62.100.67:10186/plat/index
+账号:bjyz001
+初始密码:123456
+商户ID:200044
+密钥:53c402addd464518960b1eeff9097445

+ 27 - 0
helper/refill/api/yl/bingdht/config.php

@@ -0,0 +1,27 @@
+<?php
+
+
+namespace refill\bingdht;
+
+use mtopcard;
+class config
+{
+    //lt 895 yd dx 905
+    const ORDER_URL = 'http://116.62.100.67:10186/plat/api/old/submitorder';
+    const QUERY_URL= 'http://116.62.100.67:10186/plat/api/old/queryorder';
+    const BALANCE_URL = 'http://116.62.100.67:10186/plat/api/old/queryBalance';
+
+    const USER_ID= '200044';
+    const KEY = '53c402addd464518960b1eeff9097445';
+    const NOTIFY_URL = BASE_SITE_URL . "/mobile/callback/refill_bingdht.php";
+    const operator = [
+        mtopcard\ChinaMobileCard  => 1,
+        mtopcard\ChinaUnicomCard  => 2,
+        mtopcard\ChinaTelecomCard => 3
+    ];
+    const ExtHeaders = ['Content-Type:application/x-www-form-urlencoded;charset=utf-8'];
+
+    const ERR_NOS = [
+        1000,1001,1003,1004,2001,2002,2003,2020,2021,1006,2030,3003
+    ];
+}

+ 52 - 0
helper/refill/api/yl/bjb/RefillCallBack.php

@@ -0,0 +1,52 @@
+<?php
+
+
+namespace refill\bjb;
+
+require_once(BASE_HELPER_RAPI_PATH . '/bjb/config.php');
+
+
+use refill;
+
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $sign = $this->sign($params);
+        if ($params['sgn'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        $content = $params['ord'] . $params['state'] . config::KEY;
+        return strtoupper(md5($content));
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['state']);
+        $order_sn = $params['ord'];
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false,false];
+        }
+        $order_id = $order_info['order_id'];
+        $data['official_sn'] = $params['bz'];
+
+
+        if ($status === 1) {
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false,true];
+        }
+        elseif ($status === 2) {
+            return [$order_id, false, true,true];
+        }
+        else {
+            return [$order_id, false, false,false];
+        }
+    }
+}

+ 98 - 0
helper/refill/api/yl/bjb/RefillPhone.php

@@ -0,0 +1,98 @@
+<?php
+namespace refill\bjb;
+
+require_once(BASE_HELPER_RAPI_PATH . '/bjb/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount ,string $order_sn)
+    {
+        $params['usr'] = config::USR;
+        $params['mob'] = $phone;
+        $params['amt'] = $amount;
+        $params['ord'] = $order_sn;
+        $params['tim'] = date("YmdHis");
+        $params['yysid'] = 0;
+        $params['hmlx'] = 0;
+        return $params;
+    }
+
+    public function add($card_no, $card_type,$amount,$params,&$net_errno = 0)
+    {
+        $order_sn = $params['order_sn'];
+        $params = $this->req_params($card_no,$amount,$order_sn);
+        $sign = $this->sign($params);
+        $params['sgn'] = $sign;
+
+        $resp = http_request(config::PAY_PHONE_URL,$params,'GET',false,[],$net_errno);
+
+        if (empty($resp)) {
+            return [false,'系统错误',true];
+        }
+        else
+        {
+            Log::record($resp,Log::DEBUG);
+            $resp = ltrim($resp , '|');
+
+            $resp = explode('|' , $resp);
+            if (count($resp) != 3) {
+                return [false, '返回值错误', false];
+            } elseif ($resp[0] == 0) {
+                return [true, '', false];
+            } else {
+                return [false, $resp[1], false];
+            }
+        }
+    }
+    public function query($refill_info)
+    {
+        $params['ord'] = $refill_info['order_sn'];
+        $params['usr'] = config::USR;
+        $content = $params['usr'] . $params['ord'] . config::KEY;
+        $params['sgn'] = strtoupper(md5($content));
+
+        $resp = http_request(config::QUERY_URL,$params);
+
+        if (empty($resp)) {
+            return [false,'系统错误'];
+        }
+        else
+        {
+            Log::record($resp,Log::DEBUG);
+            $resp = ltrim($resp , '|');
+            $resp = explode('|' , $resp);
+            if (count($resp) != 3) {
+                return [false, '返回值错误'];
+            } elseif ($resp[0] == 1) {
+                $order_state = ORDER_STATE_SUCCESS;
+            } elseif ($resp[0] == 2) {
+                $order_state = ORDER_STATE_CANCEL;
+            } elseif ($resp[0] == 0) {
+                $order_state = ORDER_STATE_SEND;
+            } else {
+                return [false, $resp[0]];
+            }
+            return [true, $order_state];
+        }
+    }
+
+    public function balance()
+    {
+        return [false, '暂无余额接口'];
+    }
+
+    private function sign($params)
+    {
+        $key = config::KEY;
+        $content = $params['usr'] . $params['ord'] . $params['mob'] . $params['amt'] . $params['tim'] . $key;
+        return strtoupper(md5($content));
+    }
+}

+ 14 - 0
helper/refill/api/yl/bjb/config.php

@@ -0,0 +1,14 @@
+<?php
+
+
+namespace refill\bjb;
+
+
+class config
+{
+    const PAY_PHONE_URL = 'http://47.96.37.53:806/webInface/PayPhone.ashx';
+    const QUERY_URL= 'http://47.96.37.53:806/webInface/GetOrderState.ashx';
+    const USR= '13699279618';
+    const KEY = 'd2dba2c0870b03a21ffd59df9c0cc774';
+    const API_IP = NET_IP;
+}

+ 53 - 0
helper/refill/api/yl/bjbnew/RefillCallBack.php

@@ -0,0 +1,53 @@
+<?php
+
+
+namespace refill\bjbnew;
+
+require_once(BASE_HELPER_RAPI_PATH . '/bjbnew/config.php');
+
+
+use refill;
+
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $sign = $this->sign($params);
+        if ($params['verifystring'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        $agentid = config::AGENT_ID;
+        $key = config::MerchantKey;
+        $content = "agentid={$agentid}&orderno={$params['orderno']}&orderstatus={$params['orderstatus']}&merchantKey={$key}";
+        return md5($content);
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['orderstatus']);
+        $order_sn = $params['orderno'];
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false,false];
+        }
+        $order_id = $order_info['order_id'];
+        $data['official_sn'] = $params['supplierOrderNo'];
+        Model('refill_order')->edit($order_id, $data);
+
+        if ($status === 0014) {
+            return [$order_id, true, false,true];
+        }
+        elseif ($status === 0015) {
+            return [$order_id, false, true,true];
+        }
+        else {
+            return [$order_id, false, false,false];
+        }
+    }
+}

+ 98 - 0
helper/refill/api/yl/bjbnew/RefillPhone.php

@@ -0,0 +1,98 @@
+<?php
+namespace refill\bjbnew;
+
+require_once(BASE_HELPER_RAPI_PATH . '/bjbnew/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount ,string $order_sn)
+    {
+        $params['chargenumbertype'] = 1;
+        $params['agentid'] = config::AGENT_ID;
+        $params['returntype'] = 2;
+        $params['orderid'] = $order_sn;
+        $params['chargenumber'] = $phone;
+        $params['amountmoney'] = $amount;
+        $params['source'] = 2;
+        return $params;
+    }
+
+    public function add($card_no, $card_type,$amount,$params,&$net_errno = 0)
+    {
+        $order_sn = $params['order_sn'];
+        $params = $this->req_params($card_no,$amount,$order_sn);
+        $sign = $this->sign($params);
+        $params['verifystring'] = $sign;
+
+        $resp = http_request(config::PAY_PHONE_URL,$params,'GET',false,[],$net_errno);
+
+        if (empty($resp)) {
+            return [false,'系统错误',true];
+        }
+        else
+        {
+            Log::record($resp,Log::DEBUG);
+            $resp = refill\util::xmlToArray($resp);
+            if (empty($resp)) {
+                return [false, '系统错误', true];
+            } elseif ($resp['resultno'] === '0000') {
+                return [true, $resp['orderno'], false];
+            } else {
+                return [false, $resp['resultmessage'], false];
+            }
+        }
+    }
+    public function query($refill_info)
+    {
+        $params['orderid'] = $refill_info['order_sn'];
+        $params['agentid'] = config::AGENT_ID;
+        $params['returntype'] = 2;
+        $key = config::MerchantKey;
+        $content = "agentid={$params['agentid']}&returntype={$params['returntype']}&orderid={$params['orderid']}&merchantKey={$key}";
+        $params['verifystring'] = md5($content);
+
+        $resp = http_request(config::QUERY_URL,$params);
+
+        if (empty($resp)) {
+            return [false,'系统错误'];
+        }
+        else
+        {
+            Log::record($resp,Log::DEBUG);
+            $resp = refill\util::xmlToArray($resp);
+            if (empty($resp)) {
+                return [false, '系统错误'];
+            } elseif ($resp['resultno'] == 0014) {
+                $order_state = ORDER_STATE_SUCCESS;
+            } elseif ($resp['resultno'] == 0015) {
+                $order_state = ORDER_STATE_CANCEL;
+            } elseif ($resp['resultno'] == 0016) {
+                $order_state = ORDER_STATE_SEND;
+            } else {
+                return [false, $resp['resultmessage']];
+            }
+            return [true, $order_state];
+        }
+    }
+
+    public function balance()
+    {
+        return [false, '暂无余额接口'];
+    }
+
+    private function sign($params)
+    {
+        $key = config::MerchantKey;
+        $content = "chargenumbertype={$params['chargenumbertype ']}&agentid={$params['agentid']}&returntype={$params['returntype']}&orderid={$params['orderid']}";
+        $content .= "chargenumber={$params['chargenumber']}&amountmoney={$params['amountmoney']}&ispname={$params['ispname']}&source={$params['source']}&merchantKey={$key}";
+        return md5($content);
+    }
+}

+ 14 - 0
helper/refill/api/yl/bjbnew/config.php

@@ -0,0 +1,14 @@
+<?php
+
+
+namespace refill\bjbnew;
+
+
+class config
+{
+    const PAY_PHONE_URL = 'http://ip:8107/ MainServiceBusiness/SendPhoneChargeInfo';
+    const QUERY_URL= 'http:// ip:8107/MainServiceBusiness/GetOrderInfo';
+    const AGENT_ID= '13699279618';
+    const MerchantKey = 'bb2f4aa72e1181bd9c4cf2951b890f5b';
+    const API_IP = NET_IP;
+}

+ 52 - 0
helper/refill/api/yl/bjbyd/RefillCallBack.php

@@ -0,0 +1,52 @@
+<?php
+
+
+namespace refill\bjbyd;
+
+require_once(BASE_HELPER_RAPI_PATH . '/bjbyd/config.php');
+
+
+use refill;
+
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $sign = $this->sign($params);
+        if ($params['sgn'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        $content = $params['ord'] . $params['state'] . config::KEY;
+        return strtoupper(md5($content));
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['state']);
+        $order_sn = $params['ord'];
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false,false];
+        }
+        $order_id = $order_info['order_id'];
+        $data['official_sn'] = $params['bz'];
+
+
+        if ($status === 1) {
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false,true];
+        }
+        elseif ($status === 2) {
+            return [$order_id, false, true,true];
+        }
+        else {
+            return [$order_id, false, false,false];
+        }
+    }
+}

+ 96 - 0
helper/refill/api/yl/bjbyd/RefillPhone.php

@@ -0,0 +1,96 @@
+<?php
+namespace refill\bjbyd;
+
+require_once(BASE_HELPER_RAPI_PATH . '/bjbyd/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount ,string $order_sn)
+    {
+        $params['usr'] = config::USR;
+        $params['mob'] = $phone;
+        $params['amt'] = $amount;
+        $params['ord'] = $order_sn;
+        
+        $params['tim'] = date("YmdHis");
+        $params['yysid'] = 0;
+        $params['hmlx'] = 0;
+        return $params;
+    }
+
+    public function add($card_no, $card_type,$amount,$params,&$net_errno = 0)
+    {
+        $order_sn = $params['order_sn'];
+        $params = $this->req_params($card_no,$amount,$order_sn);
+        $sign = $this->sign($params);
+        $params['sgn'] = $sign;
+
+        $resp = http_request(config::PAY_PHONE_URL,$params,'GET',false,[],$net_errno);
+
+        if (empty($resp)) {
+            return [false,'系统错误',true];
+        }
+        else
+        {
+            Log::record($resp,Log::DEBUG);
+            $resp = explode('|' , $resp);
+            if (count($resp) != 3) {
+                return [false, '返回值错误', false];
+            } elseif ($resp[0] == 0) {
+                return [true, '', false];
+            } else {
+                return [false, $resp[1], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['ord'] = $refill_info['order_sn'];
+        $params['usr'] = config::USR;
+        $content = $params['usr'] . $params['ord'] . config::KEY;
+        $params['sgn'] = strtoupper(md5($content));
+        $resp = http_request(config::QUERY_URL,$params);
+        if (empty($resp)) {
+            return [false,'系统错误'];
+        }
+        else
+        {
+            Log::record($resp,Log::DEBUG);
+            $resp = ltrim($resp , '|');
+            $resp = explode('|' , $resp);
+            if (count($resp) != 3) {
+                return [false, '返回值错误'];
+            } elseif ($resp[0] == 1) {
+                $order_state = ORDER_STATE_SUCCESS;
+            } elseif ($resp[0] == 2) {
+                $order_state = ORDER_STATE_CANCEL;
+            } elseif ($resp[0] == 0) {
+                $order_state = ORDER_STATE_SEND;
+            } else {
+                return [false, $resp[0]];
+            }
+            return [true, $order_state];
+        }
+    }
+
+    public function balance()
+    {
+        return [false, '暂无余额接口'];
+    }
+
+    private function sign($params)
+    {
+        $key = config::KEY;
+        $content = $params['usr'] . $params['ord'] . $params['mob'] . $params['amt'] . $params['tim'] . $key;
+        return strtoupper(md5($content));
+    }
+}

+ 14 - 0
helper/refill/api/yl/bjbyd/config.php

@@ -0,0 +1,14 @@
+<?php
+
+
+namespace refill\bjbyd;
+
+
+class config
+{
+    const PAY_PHONE_URL = 'http://47.96.37.53:806/webInface/PayPhone.ashx';
+    const QUERY_URL= 'http://47.96.37.53:806/webInface/GetOrderState.ashx';
+    const USR= '13699279618';
+    const KEY = 'd2dba2c0870b03a21ffd59df9c0cc774';
+    const API_IP = NET_IP;
+}

+ 58 - 0
helper/refill/api/yl/bxtwt/RefillCallBack.php

@@ -0,0 +1,58 @@
+<?php
+
+
+namespace refill\bxtwt;
+
+require_once(BASE_HELPER_RAPI_PATH . '/bxtwt/config.php');
+
+
+use refill;
+
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $sign = $this->sign($params);
+        if ($params['sign'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        $body = $params['order_number'];
+        $body .= $params['shipping_status'];
+        $body .= $params['tradeNo'];
+        $body .= config::API_CERT;
+        return strtolower(md5($body));
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['shipping_status']);
+        $order_sn = $params['tradeNo'];
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false,false];
+        }
+
+//0	充值失败
+//1	充值成功
+//2	充值中(非最终结果)
+//3	退款中(充值失败)
+//4	已退款(充值失败)
+//5	充值中未发货(非最终结果)
+//其他	提单成功(非最终结果)
+        $order_id = $order_info['order_id'];
+        if ($status === 1) {
+            return [$order_id, true, false,true];
+        }
+        elseif ($status == 0 || $status == 4) {
+            return [$order_id, false, true,true];
+        } else { //status == 3 or status == 5
+            return [$order_id, false, false,false];
+        }
+    }
+}

+ 124 - 0
helper/refill/api/yl/bxtwt/RefillPhone.php

@@ -0,0 +1,124 @@
+<?php
+
+namespace refill\bxtwt;
+
+require_once(BASE_HELPER_RAPI_PATH . '/bxtwt/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount, string $order_sn)
+    {
+        $params['phone'] = $phone;
+        $params['product_id'] = $amount;
+        $params['tradeNo'] = $order_sn;
+        $params['notify_url'] = config::NOTIFY_URL;
+
+        return json_encode($params);
+    }
+
+    public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
+    {
+        $order_sn = $params['order_sn'];
+        $params = $this->req_params($card_no, $amount, $order_sn);
+        $time = time();
+        $api_user_name = config::API_USER_NAME;
+        $sign = $this->sign($time);
+
+        $header = [
+            'Content-Type: application/json',
+            "API-USER-NAME: {$api_user_name}",
+            "API-NAME: OrderCreate",
+            "API-TIMESTAMP: {$time}",
+            "API-SIGNATURE: {$sign}",
+        ];
+
+        $resp = http_post_data(config::REQUEST_URL, $params, $header,$net_errno);
+
+        if (empty($resp)) {
+            return [false, '系统错误',true];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '系统错误', true];
+            } elseif ($resp['ack'] == 'success') {
+                return [true, $resp['message']['order_number'], false];
+            } else {
+                return [false, $resp['message'], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['order_number'] = $refill_info['ch_trade_no'];
+        $params['tradeNo'] = $refill_info['order_sn'];
+
+        $time = time();
+        $api_user_name = config::API_USER_NAME;
+        $sign = $this->sign($time);
+
+        $header = [
+            'Content-Type: application/json',
+            "API-USER-NAME: {$api_user_name}",
+            "API-NAME: OrderQuery",
+            "API-TIMESTAMP: {$time}",
+            "API-SIGNATURE: {$sign}",
+        ];
+
+        $resp = http_post_data(config::REQUEST_URL, json_encode($params), $header);
+
+        if (empty($resp)) {
+            return [false, '系统错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '系统错误'];
+            }
+            elseif ($resp['ack'] == 'success')
+            {
+                $data = $resp['order'];
+                if ($data['shipping_status'] == 1) {
+                    $order_state = ORDER_STATE_SUCCESS;
+                } elseif (in_array($data['shipping_status'], [0,3,4])) {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif (in_array($data['shipping_status'], [2,5])) {
+                    $order_state = ORDER_STATE_SEND;
+                } else {
+                    return [false, $resp['message']];
+                }
+                return [true, $order_state];
+            }
+            else {
+                return [false, $resp['message']];
+            }
+        }
+    }
+
+    public function balance()
+    {
+        return [false, '暂无余额接口'];
+    }
+
+    private function sign($time)
+    {
+        $ip = config::API_IP;
+        $cert = config::API_CERT;
+        $content = $ip . $time . $cert;
+
+        return md5($content);
+    }
+}

+ 14 - 0
helper/refill/api/yl/bxtwt/config.php

@@ -0,0 +1,14 @@
+<?php
+
+
+namespace refill\bxtwt;
+
+
+class config
+{
+    const REQUEST_URL = 'http://8.129.76.127/APIHfKc/v2/';
+    const API_USER_NAME= '08aa9b2e2ef44b14bc6ac53fe8253b36';
+    const API_CERT = '44143b70ec8cca16cdb533e3c637f410';
+    const NOTIFY_URL =  BASE_SITE_URL."/mobile/refill_bxtwt.php";
+    const API_IP = NET_IP;
+}

BIN
helper/refill/api/yl/cangbu/APIdoc直充.docx


BIN
helper/refill/api/yl/cangbu/APIdoc直冲(旧).docx


+ 69 - 0
helper/refill/api/yl/cangbu/RefillCallBack.php

@@ -0,0 +1,69 @@
+<?php
+namespace refill\cangbu;
+
+require_once(BASE_HELPER_RAPI_PATH . '/cangbu/config.php');
+
+use refill;
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $input = $params;
+        unset($input['sign']);
+        $sign = $this->sign($input);
+        if ($params['sign'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        $content = '';
+        ksort($params);
+        foreach ($params as $key => $val){
+            if(false === $this->check_empty($val)) {
+                $content .= "{$key}={$val}&";
+            }
+        }
+        $content .= "key=".config::KEY;
+
+        return md5($content);
+    }
+
+
+    protected function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['code']);
+        $order_sn = $params['tmporder'];
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false,false];
+        }
+
+        $order_id = $order_info['order_id'];
+        if ($status === 1) {
+            $data['official_sn'] = strtolower($params['voucher']) == 'null' ? '' : $params['voucher'];
+            $data['ch_trade_no'] = strtolower($params['orderno']) == 'null' ? '' : $params['orderno'];
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false, true];
+        } elseif ($status === -1) {
+            return [$order_id, false, true, true];
+        } else {
+            return [$order_id, false, false, false];
+        }
+    }
+}

+ 144 - 0
helper/refill/api/yl/cangbu/RefillPhone.php

@@ -0,0 +1,144 @@
+<?php
+
+namespace refill\cangbu;
+
+require_once(BASE_HELPER_RAPI_PATH . '/cangbu/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount, int $card_type, string $order_sn)
+    {
+        $params['customerId'] = config::MCH_ID;
+        $params['timestamp'] = time();
+        $params['orderno'] = $order_sn;
+        $params['itemId'] = config::operator[$card_type];
+        $params['checkItemFacePrice'] = $amount;
+        $params['number'] = $phone;
+        $params['amt'] = 1;
+        $params['notify_url'] = config::NOTIFY_URL;
+        $params['overtime'] = 1;
+
+        return $params;
+    }
+
+    public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
+    {
+        $order_sn = $params['order_sn'];
+        $params = $this->req_params($card_no, $amount, $card_type, $order_sn);
+
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+
+        $resp = http_request(config::ORDER_URL, $params, 'POST', false, config::ExtHeaders, $net_errno);
+
+        if (empty($resp)) {
+            return [false, '网络错误', true];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误', true];
+            } elseif ($resp['code'] === 1) {
+                return [true, '', false];
+            } else {
+                return [false, $resp['msg'], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['customerId'] = config::MCH_ID;
+        $params['timestamp'] = time();
+        $params['orderno'] = $refill_info['order_sn'];
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+
+        $resp = http_request(config::QUERY_URL, $params, 'POST', false, config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            }
+
+            if($resp['code'] === 1)
+            {
+                $status = $resp['data']['status'];
+                if ($status === 2) {
+                    Model('refill_order')->edit($refill_info['order_id'], ['official_sn' => $resp['data']['officialOrderNo'], 'ch_trade_no' => $resp['data']['agentOrderNo']]);
+                    $order_state = ORDER_STATE_SUCCESS;
+                } elseif ($status === 3) {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif (in_array($status, [0, 1], true)) {
+                    $order_state = ORDER_STATE_SEND;
+                } else {
+                    return [false, $status];
+                }
+                return [true, $order_state];
+            }
+            elseif($resp['code'] === -1 && $resp['msg'] == '没有该订单')
+            {
+                return [true, ORDER_STATE_NOEXIST];
+            }
+            else
+            {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+    public function balance()
+    {
+        $params['customerId'] = config::MCH_ID;
+        $params['timestamp'] = time();
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+
+        $resp = http_request(config::BALANCE_URL, $params, 'POST', false, config::ExtHeaders);
+        if(empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            } elseif ($resp['code'] === 1) {
+                return [true, $resp['data']['balance']];
+            } else {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+    private function sign($params)
+    {
+        $content = '';
+        ksort($params);
+        foreach ($params as $key => $val){
+            if(false === $this->check_empty($val)) {
+                $content .= "{$key}={$val}&";
+            }
+        }
+        $content .= "key=".config::KEY;
+
+        return md5($content);
+    }
+}

+ 6 - 0
helper/refill/api/yl/cangbu/account.txt

@@ -0,0 +1,6 @@
+地址https://huadan.irecycle.top/   
+账户18500608333  
+密码123456
+
+mchid 112
+key zs53xG61NinhlrXskhR0xnAaOyM7yG

+ 23 - 0
helper/refill/api/yl/cangbu/config.php

@@ -0,0 +1,23 @@
+<?php
+
+
+namespace refill\cangbu;
+
+use mtopcard;
+class config
+{
+    //yd 950 dl949
+    const ORDER_URL = 'https://api.irecycle.top/queryBuy';
+    const QUERY_URL= 'https://api.irecycle.top/queryBizOrder';
+    const BALANCE_URL= 'https://api.irecycle.top//queryBalance';
+
+    const MCH_ID= '112';
+    const KEY = 'zs53xG61NinhlrXskhR0xnAaOyM7yG';
+    const NOTIFY_URL = BASE_SITE_URL . "/mobile/callback/refill_cangbu.php";
+    const operator = [
+        mtopcard\ChinaMobileCard  => 'MOBILE',
+        mtopcard\ChinaUnicomCard  => 'UNICOM',
+        mtopcard\ChinaTelecomCard => 'TELECOM'
+    ];
+    const ExtHeaders = ['Content-Type: application/x-www-form-urlencoded' , 'Accept: application/json;charset=UTF-8'];
+}

BIN
helper/refill/api/yl/cangbu_high/APIdoc直充.docx


+ 69 - 0
helper/refill/api/yl/cangbu_high/RefillCallBack.php

@@ -0,0 +1,69 @@
+<?php
+namespace refill\cangbu_high;
+
+require_once(BASE_HELPER_RAPI_PATH . '/cangbu_high/config.php');
+
+use refill;
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $input = $params;
+        unset($input['sign']);
+        $sign = $this->sign($input);
+        if ($params['sign'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        $content = '';
+        ksort($params);
+        foreach ($params as $key => $val){
+            if(false === $this->check_empty($val)) {
+                $content .= "{$key}={$val}&";
+            }
+        }
+        $content .= "key=".config::KEY;
+
+        return md5($content);
+    }
+
+
+    protected function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['code']);
+        $order_sn = $params['tmporder'];
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false,false];
+        }
+
+        $order_id = $order_info['order_id'];
+        if ($status === 1) {
+            $data['official_sn'] = strtolower($params['voucher']) == 'null' ? '' : $params['voucher'];
+            $data['ch_trade_no'] = strtolower($params['orderno']) == 'null' ? '' : $params['orderno'];
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false, true];
+        } elseif ($status === -1) {
+            return [$order_id, false, true, true];
+        } else {
+            return [$order_id, false, false, false];
+        }
+    }
+}

+ 144 - 0
helper/refill/api/yl/cangbu_high/RefillPhone.php

@@ -0,0 +1,144 @@
+<?php
+
+namespace refill\cangbu_high;
+
+require_once(BASE_HELPER_RAPI_PATH . '/cangbu_high/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount, int $card_type, string $order_sn)
+    {
+        $params['customerId'] = config::MCH_ID;
+        $params['timestamp'] = time();
+        $params['orderno'] = $order_sn;
+        $params['itemId'] = config::operator[$card_type];
+        $params['checkItemFacePrice'] = $amount;
+        $params['number'] = $phone;
+        $params['amt'] = 1;
+        $params['notify_url'] = config::NOTIFY_URL;
+        $params['overtime'] = 1;
+
+        return $params;
+    }
+
+    public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
+    {
+        $order_sn = $params['order_sn'];
+        $params = $this->req_params($card_no, $amount, $card_type, $order_sn);
+
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+
+        $resp = http_request(config::ORDER_URL, $params, 'POST', false, config::ExtHeaders, $net_errno);
+
+        if (empty($resp)) {
+            return [false, '网络错误', true];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误', true];
+            } elseif ($resp['code'] === 1) {
+                return [true, '', false];
+            } else {
+                return [false, $resp['msg'], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['customerId'] = config::MCH_ID;
+        $params['timestamp'] = time();
+        $params['orderno'] = $refill_info['order_sn'];
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+
+        $resp = http_request(config::QUERY_URL, $params, 'POST', false, config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            }
+
+            if($resp['code'] === 1)
+            {
+                $status = $resp['data']['status'];
+                if ($status === 2) {
+                    Model('refill_order')->edit($refill_info['order_id'], ['official_sn' => $resp['data']['officialOrderNo'], 'ch_trade_no' => $resp['data']['agentOrderNo']]);
+                    $order_state = ORDER_STATE_SUCCESS;
+                } elseif ($status === 3) {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif (in_array($status, [0, 1], true)) {
+                    $order_state = ORDER_STATE_SEND;
+                } else {
+                    return [false, $status];
+                }
+                return [true, $order_state];
+            }
+            elseif($resp['code'] === -1 && $resp['msg'] == '没有该订单')
+            {
+                return [true, ORDER_STATE_NOEXIST];
+            }
+            else
+            {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+    public function balance()
+    {
+        $params['customerId'] = config::MCH_ID;
+        $params['timestamp'] = time();
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+
+        $resp = http_request(config::BALANCE_URL, $params, 'POST', false, config::ExtHeaders);
+        if(empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            } elseif ($resp['code'] === 1) {
+                return [true, $resp['data']['balance']];
+            } else {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+    private function sign($params)
+    {
+        $content = '';
+        ksort($params);
+        foreach ($params as $key => $val){
+            if(false === $this->check_empty($val)) {
+                $content .= "{$key}={$val}&";
+            }
+        }
+        $content .= "key=".config::KEY;
+
+        return md5($content);
+    }
+}

+ 3 - 0
helper/refill/api/yl/cangbu_high/account.txt

@@ -0,0 +1,3 @@
+https://huadan.irecycle.top/
+账户18513846008
+密码123456

+ 22 - 0
helper/refill/api/yl/cangbu_high/config.php

@@ -0,0 +1,22 @@
+<?php
+
+
+namespace refill\cangbu_high;
+
+use mtopcard;
+class config
+{
+    const ORDER_URL = 'https://api.irecycle.top/queryBuy';
+    const QUERY_URL= 'https://api.irecycle.top/queryBizOrder';
+    const BALANCE_URL= 'https://api.irecycle.top//queryBalance';
+
+    const MCH_ID= '225';
+    const KEY = 'Nh4uHk9DyOtKe2XXECpb4NSDL4pZiG';
+    const NOTIFY_URL = BASE_SITE_URL . "/mobile/callback/refill_cangbu_high.php";
+    const operator = [
+        mtopcard\ChinaMobileCard  => 'MOBILE',
+        mtopcard\ChinaUnicomCard  => 'UNICOM',
+        mtopcard\ChinaTelecomCard => 'TELECOM'
+    ];
+    const ExtHeaders = ['Content-Type: application/x-www-form-urlencoded' , 'Accept: application/json;charset=UTF-8'];
+}

BIN
helper/refill/api/yl/cangbukami/APIdoc直充.docx


BIN
helper/refill/api/yl/cangbukami/APIdoc直冲(旧).docx


+ 69 - 0
helper/refill/api/yl/cangbukami/RefillCallBack.php

@@ -0,0 +1,69 @@
+<?php
+namespace refill\cangbukami;
+
+require_once(BASE_HELPER_RAPI_PATH . '/cangbukami/config.php');
+
+use refill;
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $input = $params;
+        unset($input['sign']);
+        $sign = $this->sign($input);
+        if ($params['sign'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        $content = '';
+        ksort($params);
+        foreach ($params as $key => $val){
+            if(false === $this->check_empty($val)) {
+                $content .= "{$key}={$val}&";
+            }
+        }
+        $content .= "key=".config::KEY;
+
+        return md5($content);
+    }
+
+
+    protected function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['code']);
+        $order_sn = $params['tmporder'];
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false,false];
+        }
+
+        $order_id = $order_info['order_id'];
+        if ($status === 1) {
+            $data['official_sn'] = strtolower($params['voucher']) == 'null' ? '' : $params['voucher'];
+            $data['ch_trade_no'] = strtolower($params['orderno']) == 'null' ? '' : $params['orderno'];
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false, true];
+        } elseif ($status === -1) {
+            return [$order_id, false, true, true];
+        } else {
+            return [$order_id, false, false, false];
+        }
+    }
+}

+ 144 - 0
helper/refill/api/yl/cangbukami/RefillPhone.php

@@ -0,0 +1,144 @@
+<?php
+
+namespace refill\cangbukami;
+
+require_once(BASE_HELPER_RAPI_PATH . '/cangbukami/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount, string $order_sn)
+    {
+        $params['customerId'] = config::MCH_ID;
+        $params['timestamp'] = time();
+        $params['orderno'] = $order_sn;
+        $params['itemId'] = config::operator[$amount];
+        $params['checkItemFacePrice'] = $amount;
+        $params['number'] = $phone;
+        $params['amt'] = 1;
+        $params['notify_url'] = config::NOTIFY_URL;
+        $params['overtime'] = 1;
+
+        return $params;
+    }
+
+    public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
+    {
+        $order_sn = $params['order_sn'];
+        $params = $this->req_params($card_no, $amount, $order_sn);
+
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+
+        $resp = http_request(config::ORDER_URL, $params, 'POST', false, config::ExtHeaders, $net_errno);
+
+        if (empty($resp)) {
+            return [false, '网络错误', true];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误', true];
+            } elseif ($resp['code'] === 1) {
+                return [true, '', false];
+            } else {
+                return [false, $resp['msg'], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['customerId'] = config::MCH_ID;
+        $params['timestamp'] = time();
+        $params['orderno'] = $refill_info['order_sn'];
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+
+        $resp = http_request(config::QUERY_URL, $params, 'POST', false, config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            }
+
+            if($resp['code'] === 1)
+            {
+                $status = $resp['data']['status'];
+                if ($status === 2) {
+                    Model('refill_order')->edit($refill_info['order_id'], ['official_sn' => $resp['data']['officialOrderNo'], 'ch_trade_no' => $resp['data']['agentOrderNo']]);
+                    $order_state = ORDER_STATE_SUCCESS;
+                } elseif ($status === 3) {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif (in_array($status, [0, 1], true)) {
+                    $order_state = ORDER_STATE_SEND;
+                } else {
+                    return [false, $status];
+                }
+                return [true, $order_state];
+            }
+            elseif($resp['code'] === -1 && $resp['msg'] == '没有该订单')
+            {
+                return [true, ORDER_STATE_NOEXIST];
+            }
+            else
+            {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+    public function balance()
+    {
+        $params['customerId'] = config::MCH_ID;
+        $params['timestamp'] = time();
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+
+        $resp = http_request(config::BALANCE_URL, $params, 'POST', false, config::ExtHeaders);
+        if(empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            } elseif ($resp['code'] === 1) {
+                return [true, $resp['data']['balance']];
+            } else {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+    private function sign($params)
+    {
+        $content = '';
+        ksort($params);
+        foreach ($params as $key => $val){
+            if(false === $this->check_empty($val)) {
+                $content .= "{$key}={$val}&";
+            }
+        }
+        $content .= "key=".config::KEY;
+
+        return md5($content);
+    }
+}

+ 6 - 0
helper/refill/api/yl/cangbukami/account.txt

@@ -0,0 +1,6 @@
+地址https://huadan.irecycle.top/   
+账户18500608333  
+密码123456
+
+mchid 112
+key zs53xG61NinhlrXskhR0xnAaOyM7yG

+ 25 - 0
helper/refill/api/yl/cangbukami/config.php

@@ -0,0 +1,25 @@
+<?php
+
+
+namespace refill\cangbukami;
+
+use mtopcard;
+class config
+{
+    //yd 950 dl949
+    const ORDER_URL = 'https://api.irecycle.top/queryBuy';
+    const QUERY_URL= 'https://api.irecycle.top/queryBizOrder';
+    const BALANCE_URL= 'https://api.irecycle.top//queryBalance';
+
+    const MCH_ID= '112';
+    const KEY = 'zs53xG61NinhlrXskhR0xnAaOyM7yG';
+//    const NOTIFY_URL = BASE_SITE_URL . "/mobile/callback/refill_cangbukami.php";
+    const NOTIFY_URL = "https://www.xyzshops.cn/mobile/signature.php";
+    const operator = [
+        20  => 'xydclt20',
+        30  => 'xydclt30',
+        50  => 'xydclt50',
+        100 => 'xydclt100'
+    ];
+    const ExtHeaders = ['Content-Type: application/x-www-form-urlencoded' , 'Accept: application/json;charset=UTF-8'];
+}

BIN
helper/refill/api/yl/cangbuyd/APIdoc直充.docx


+ 69 - 0
helper/refill/api/yl/cangbuyd/RefillCallBack.php

@@ -0,0 +1,69 @@
+<?php
+namespace refill\cangbuyd;
+
+require_once(BASE_HELPER_RAPI_PATH . '/cangbuyd/config.php');
+
+use refill;
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $input = $params;
+        unset($input['sign']);
+        $sign = $this->sign($input);
+        if ($params['sign'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        $content = '';
+        ksort($params);
+        foreach ($params as $key => $val){
+            if(false === $this->check_empty($val)) {
+                $content .= "{$key}={$val}&";
+            }
+        }
+        $content .= "key=".config::KEY;
+
+        return md5($content);
+    }
+
+
+    protected function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['code']);
+        $order_sn = $params['tmporder'];
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false,false];
+        }
+
+        $order_id = $order_info['order_id'];
+        if ($status === 1) {
+            $data['official_sn'] = strtolower($params['voucher']) == 'null' ? '' : $params['voucher'];
+            $data['ch_trade_no'] = strtolower($params['orderno']) == 'null' ? '' : $params['orderno'];
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false, true];
+        } elseif ($status === -1) {
+            return [$order_id, false, true, true];
+        } else {
+            return [$order_id, false, false, false];
+        }
+    }
+}

+ 144 - 0
helper/refill/api/yl/cangbuyd/RefillPhone.php

@@ -0,0 +1,144 @@
+<?php
+
+namespace refill\cangbuyd;
+
+require_once(BASE_HELPER_RAPI_PATH . '/cangbuyd/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount, int $card_type, string $order_sn)
+    {
+        $params['customerId'] = config::MCH_ID;
+        $params['timestamp'] = time();
+        $params['orderno'] = $order_sn;
+        $params['itemId'] = config::operator[$card_type];
+        $params['checkItemFacePrice'] = $amount;
+        $params['number'] = $phone;
+        $params['amt'] = 1;
+        $params['notify_url'] = config::NOTIFY_URL;
+        $params['overtime'] = 1;
+
+        return $params;
+    }
+
+    public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
+    {
+        $order_sn = $params['order_sn'];
+        $params = $this->req_params($card_no, $amount, $card_type, $order_sn);
+
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+
+        $resp = http_request(config::ORDER_URL, $params, 'POST', false, config::ExtHeaders, $net_errno);
+
+        if (empty($resp)) {
+            return [false, '网络错误', true];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误', true];
+            } elseif ($resp['code'] === 1) {
+                return [true, '', false];
+            } else {
+                return [false, $resp['msg'], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['customerId'] = config::MCH_ID;
+        $params['timestamp'] = time();
+        $params['orderno'] = $refill_info['order_sn'];
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+
+        $resp = http_request(config::QUERY_URL, $params, 'POST', false, config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            }
+
+            if($resp['code'] === 1)
+            {
+                $status = $resp['data']['status'];
+                if ($status === 2) {
+                    Model('refill_order')->edit($refill_info['order_id'], ['official_sn' => $resp['data']['officialOrderNo'], 'ch_trade_no' => $resp['data']['agentOrderNo']]);
+                    $order_state = ORDER_STATE_SUCCESS;
+                } elseif ($status === 3) {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif (in_array($status, [0, 1], true)) {
+                    $order_state = ORDER_STATE_SEND;
+                } else {
+                    return [false, $status];
+                }
+                return [true, $order_state];
+            }
+            elseif($resp['code'] === -1 && $resp['msg'] == '没有该订单')
+            {
+                return [true, ORDER_STATE_NOEXIST];
+            }
+            else
+            {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+    public function balance()
+    {
+        $params['customerId'] = config::MCH_ID;
+        $params['timestamp'] = time();
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+
+        $resp = http_request(config::BALANCE_URL, $params, 'POST', false, config::ExtHeaders);
+        if(empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            } elseif ($resp['code'] === 1) {
+                return [true, $resp['data']['balance']];
+            } else {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+    private function sign($params)
+    {
+        $content = '';
+        ksort($params);
+        foreach ($params as $key => $val){
+            if(false === $this->check_empty($val)) {
+                $content .= "{$key}={$val}&";
+            }
+        }
+        $content .= "key=".config::KEY;
+
+        return md5($content);
+    }
+}

+ 4 - 0
helper/refill/api/yl/cangbuyd/account.txt

@@ -0,0 +1,4 @@
+账户15811535608
+密码123456
+安全码123456
+后台地址https://huadan.irecycle.top/

+ 22 - 0
helper/refill/api/yl/cangbuyd/config.php

@@ -0,0 +1,22 @@
+<?php
+
+
+namespace refill\cangbuyd;
+
+use mtopcard;
+class config
+{
+    const ORDER_URL = 'https://api.irecycle.top/queryBuy';
+    const QUERY_URL= 'https://api.irecycle.top/queryBizOrder';
+    const BALANCE_URL= 'https://api.irecycle.top//queryBalance';
+
+    const MCH_ID= '220';
+    const KEY = '5lEtcVlnQJpEObGYPJF6qf0SqJObB0';
+    const NOTIFY_URL = BASE_SITE_URL . "/mobile/callback/refill_cangbuyd.php";
+    const operator = [
+        mtopcard\ChinaMobileCard  => 'MOBILE',
+        mtopcard\ChinaUnicomCard  => 'UNICOM',
+        mtopcard\ChinaTelecomCard => 'TELECOM'
+    ];
+    const ExtHeaders = ['Content-Type: application/x-www-form-urlencoded' , 'Accept: application/json;charset=UTF-8'];
+}

+ 66 - 0
helper/refill/api/yl/cangxin/RefillCallBack.php

@@ -0,0 +1,66 @@
+<?php
+namespace refill\cangxin;
+
+require_once(BASE_HELPER_RAPI_PATH . '/cangxin/config.php');
+
+use refill;
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $input = $params;
+        unset($input['verifyString']);
+        $sign = $this->sign($input);
+        if ($params['verifyString'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        ksort($params);
+        $content = '';
+        foreach ($params as $key => $value) {
+            if($this->check_empty($value) === false) {
+                $content .= "{$key}={$value}&";
+            }
+        }
+        $content = $content . "key=" . config::Key;
+        return md5($content);
+    }
+
+    private function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['status']);
+        $order_sn = $params['clientOrderNo'];
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false,false];
+        }
+
+        $order_id = $order_info['order_id'];
+        if ($status === 4) {
+            $data['official_sn'] = strtolower($params['officialOrderNo']) == 'null' ? '' : $params['officialOrderNo'];
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false, true];
+        } elseif ($status === 3) {
+            return [$order_id, false, true, true];
+        } else {
+            return [$order_id, false, false, false];
+        }
+    }
+}

+ 134 - 0
helper/refill/api/yl/cangxin/RefillPhone.php

@@ -0,0 +1,134 @@
+<?php
+
+namespace refill\cangxin;
+
+require_once(BASE_HELPER_RAPI_PATH . '/cangxin/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount, int $card_type, string $order_sn)
+    {
+        $params['clientId'] = config::clientId;
+        $params['clientOrderNo'] = $order_sn;
+        $params['account'] = $phone;
+        $params['skuCode'] = config::PRODUCT[$card_type][$amount];
+        $params['amount'] = $amount;
+        $params['callbackUrl'] = config::NOTIFY_URL;
+        return $params;
+    }
+
+    public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
+    {
+        $order_sn = $params['order_sn'];
+        $params = $this->req_params($card_no, $amount, $card_type, $order_sn);
+        if(empty($params['skuCode'])) {
+            return [false, '商品编号错误', false];
+        }
+        $sign = $this->sign($params);
+        $params['verifyString'] = $sign;
+
+        $resp = http_request(config::ORDER_URL, $params, 'POST', false, config::ExtHeaders, $net_errno);
+
+        if (empty($resp)) {
+            return [false, '网络错误', true];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误', true];
+            } elseif ($resp['code'] === 200) {
+                return [true, $resp['data']['sysOrderNo'], false];
+            } else {
+                return [false, $resp['msg'], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['clientId'] = config::clientId;
+        $params['clientOrderNo'] = $refill_info['order_sn'];
+        $params['verifyString'] = $this->sign($params);
+
+        $resp = http_request(config::QUERY_URL, $params, 'POST', false, config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            }
+            elseif ($resp['code'] === 200)
+            {
+                $data = $resp['data'];
+                $status = $data['status'];
+                if ($status === '4') {
+                    $updata['official_sn'] = $data['officialOrderNo'];
+                    Model('refill_order')->edit($refill_info['order_id'], $updata);
+                    $order_state = ORDER_STATE_SUCCESS;
+                } elseif ($status === '3') {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif ($status === '0' || $status === '2') {
+                    $order_state = ORDER_STATE_SEND;
+                } else {
+                    return [false, $resp['msg']];
+                }
+                return [true, $order_state];
+            }
+            elseif ($resp['code'] === -9 && (time() - $refill_info['commit_time'] >= 600))
+            {
+                return [true, ORDER_STATE_NOEXIST];
+            }
+            else
+            {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+    public function balance()
+    {
+        $params['clientId'] = config::clientId;
+        $params['verifyString'] = $this->sign($params);
+
+        $resp = http_request(config::BALANCE_URL, $params, 'POST', false, config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            } elseif ($resp['code'] === 200) {
+                return [true, $resp['data']['balance']];
+            } else {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+    private function sign($params)
+    {
+        ksort($params);
+        $str = urldecode(http_build_query($params));
+        $str .= '&key=' . config::Key;
+        return md5($str);
+    }
+}

+ 37 - 0
helper/refill/api/yl/cangxin/config.php

@@ -0,0 +1,37 @@
+<?php
+
+
+namespace refill\cangxin;
+
+use mtopcard;
+class config
+{
+    const ORDER_URL = 'http://47.98.184.74:9527/order/submit';
+    const QUERY_URL = 'http://47.98.184.74:9527/order/query';
+    const BALANCE_URL = 'http://47.98.184.74:9527/order/balance';
+
+    const clientId = '10025';
+    const Key = 'GeuVXsmZVhPwkqNLaL9THdAk2j5x3mJh';
+    const NOTIFY_URL = BASE_SITE_URL . "/mobile/callback/refill_cangxin.php";
+    const PRODUCT = [
+        mtopcard\ChinaMobileCard => [
+            30  => 1320030,
+            50  => 1320050,
+            100 => 1320100,
+            200 => 1320200,
+        ],
+        mtopcard\ChinaUnicomCard => [
+            30  => 3320030,
+            50  => 3320050,
+            100 => 3320100,
+            200 => 3320200,
+        ],
+        mtopcard\ChinaTelecomCard => [
+            30  => 2320030,
+            50  => 2320050,
+            100 => 2320100,
+            200 => 2320200,
+        ],
+    ];
+    const ExtHeaders = ['Content-Type:application/x-www-form-urlencoded;charset=utf-8'];
+}

+ 16 - 0
helper/refill/api/yl/cangxin/开户信息.txt

@@ -0,0 +1,16 @@
+商户号  10025
+秘钥GeuVXsmZVhPwkqNLaL9THdAk2j5x3mJh
+对接文档https://www.showdoc.com.cn/1720387349860903/8044417869640483
+
+1320030  全国移动30元
+1320050  全国移动50元
+1320100  全国移动100元
+1320200  全国移动200元
+2320030  全国电信30元
+2320050  全国电信50元
+2320100  全国电信100元
+2320200  全国电信200元
+3320030  全国联通30元
+3320050  全国联通50元
+3320100  全国联通100元
+3320200  全国联通200元

+ 66 - 0
helper/refill/api/yl/cangxin_high/RefillCallBack.php

@@ -0,0 +1,66 @@
+<?php
+namespace refill\cangxin_high;
+
+require_once(BASE_HELPER_RAPI_PATH . '/cangxin_high/config.php');
+
+use refill;
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $input = $params;
+        unset($input['verifyString']);
+        $sign = $this->sign($input);
+        if ($params['verifyString'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        ksort($params);
+        $content = '';
+        foreach ($params as $key => $value) {
+            if($this->check_empty($value) === false) {
+                $content .= "{$key}={$value}&";
+            }
+        }
+        $content = $content . "key=" . config::Key;
+        return md5($content);
+    }
+
+    private function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['status']);
+        $order_sn = $params['clientOrderNo'];
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false,false];
+        }
+
+        $order_id = $order_info['order_id'];
+        if ($status === 4) {
+            $data['official_sn'] = strtolower($params['officialOrderNo']) == 'null' ? '' : $params['officialOrderNo'];
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false, true];
+        } elseif ($status === 3) {
+            return [$order_id, false, true, true];
+        } else {
+            return [$order_id, false, false, false];
+        }
+    }
+}

+ 134 - 0
helper/refill/api/yl/cangxin_high/RefillPhone.php

@@ -0,0 +1,134 @@
+<?php
+
+namespace refill\cangxin_high;
+
+require_once(BASE_HELPER_RAPI_PATH . '/cangxin_high/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount, int $card_type, string $order_sn)
+    {
+        $params['clientId'] = config::clientId;
+        $params['clientOrderNo'] = $order_sn;
+        $params['account'] = $phone;
+        $params['skuCode'] = config::PRODUCT[$card_type][$amount];
+        $params['amount'] = $amount;
+        $params['callbackUrl'] = config::NOTIFY_URL;
+        return $params;
+    }
+
+    public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
+    {
+        $order_sn = $params['order_sn'];
+        $params = $this->req_params($card_no, $amount, $card_type, $order_sn);
+        if(empty($params['skuCode'])) {
+            return [false, '商品编号错误', false];
+        }
+        $sign = $this->sign($params);
+        $params['verifyString'] = $sign;
+
+        $resp = http_request(config::ORDER_URL, $params, 'POST', false, config::ExtHeaders, $net_errno);
+
+        if (empty($resp)) {
+            return [false, '网络错误', true];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误', true];
+            } elseif ($resp['code'] === 200) {
+                return [true, $resp['data']['sysOrderNo'], false];
+            } else {
+                return [false, $resp['msg'], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['clientId'] = config::clientId;
+        $params['clientOrderNo'] = $refill_info['order_sn'];
+        $params['verifyString'] = $this->sign($params);
+
+        $resp = http_request(config::QUERY_URL, $params, 'POST', false, config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            }
+            elseif ($resp['code'] === 200)
+            {
+                $data = $resp['data'];
+                $status = $data['status'];
+                if ($status === '4') {
+                    $updata['official_sn'] = $data['officialOrderNo'];
+                    Model('refill_order')->edit($refill_info['order_id'], $updata);
+                    $order_state = ORDER_STATE_SUCCESS;
+                } elseif ($status === '3') {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif ($status === '0' || $status === '2') {
+                    $order_state = ORDER_STATE_SEND;
+                } else {
+                    return [false, $resp['msg']];
+                }
+                return [true, $order_state];
+            }
+            elseif ($resp['code'] === -9 && (time() - $refill_info['commit_time'] >= 600))
+            {
+                return [true, ORDER_STATE_NOEXIST];
+            }
+            else
+            {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+    public function balance()
+    {
+        $params['clientId'] = config::clientId;
+        $params['verifyString'] = $this->sign($params);
+
+        $resp = http_request(config::BALANCE_URL, $params, 'POST', false, config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            } elseif ($resp['code'] === 200) {
+                return [true, $resp['data']['balance']];
+            } else {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+    private function sign($params)
+    {
+        ksort($params);
+        $str = urldecode(http_build_query($params));
+        $str .= '&key=' . config::Key;
+        return md5($str);
+    }
+}

+ 37 - 0
helper/refill/api/yl/cangxin_high/config.php

@@ -0,0 +1,37 @@
+<?php
+
+
+namespace refill\cangxin_high;
+
+use mtopcard;
+class config
+{
+    const ORDER_URL = 'http://47.98.184.74:9527/order/submit';
+    const QUERY_URL = 'http://47.98.184.74:9527/order/query';
+    const BALANCE_URL = 'http://47.98.184.74:9527/order/balance';
+
+    const clientId = '10020';
+    const Key = 'DUAhOAfjyHwEK2x4tuWRfaKsq6QwY8s1';
+    const NOTIFY_URL = BASE_SITE_URL . "/mobile/callback/refill_cangxin_high.php";
+    const PRODUCT = [
+        mtopcard\ChinaMobileCard => [
+            30  => 1320030,
+            50  => 1320050,
+            100 => 1320100,
+            200 => 1320200,
+        ],
+        mtopcard\ChinaUnicomCard => [
+            30  => 3320030,
+            50  => 3320050,
+            100 => 3320100,
+            200 => 3320200,
+        ],
+        mtopcard\ChinaTelecomCard => [
+            30  => 2320030,
+            50  => 2320050,
+            100 => 2320100,
+            200 => 2320200,
+        ],
+    ];
+    const ExtHeaders = ['Content-Type:application/x-www-form-urlencoded;charset=utf-8'];
+}

+ 16 - 0
helper/refill/api/yl/cangxin_high/开户信息.txt

@@ -0,0 +1,16 @@
+商户id 10020
+秘钥DUAhOAfjyHwEK2x4tuWRfaKsq6QwY8s1
+对接文档https://www.showdoc.com.cn/1720387349860903/8044417869640483
+
+1320030  全国移动30元
+1320050  全国移动50元
+1320100  全国移动100元
+1320200  全国移动200元
+2320030  全国电信30元
+2320050  全国电信50元
+2320100  全国电信100元
+2320200  全国电信200元
+3320030  全国联通30元
+3320050  全国联通50元
+3320100  全国联通100元
+3320200  全国联通200元

+ 66 - 0
helper/refill/api/yl/cangxin_yi/RefillCallBack.php

@@ -0,0 +1,66 @@
+<?php
+namespace refill\cangxin_yi;
+
+require_once(BASE_HELPER_RAPI_PATH . '/cangxin_yi/config.php');
+
+use refill;
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $input = $params;
+        unset($input['verifyString']);
+        $sign = $this->sign($input);
+        if ($params['verifyString'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        ksort($params);
+        $content = '';
+        foreach ($params as $key => $value) {
+            if($this->check_empty($value) === false) {
+                $content .= "{$key}={$value}&";
+            }
+        }
+        $content = $content . "key=" . config::Key;
+        return md5($content);
+    }
+
+    private function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['status']);
+        $order_sn = $params['clientOrderNo'];
+        $order_info = Model('vr_order')->getOrderInfo(['order_sn' => $order_sn]);
+        if (empty($order_info)) {
+            return [false, false, false,false];
+        }
+
+        $order_id = $order_info['order_id'];
+        if ($status === 4) {
+            $data['official_sn'] = strtolower($params['officialOrderNo']) == 'null' ? '' : $params['officialOrderNo'];
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false, true];
+        } elseif ($status === 3) {
+            return [$order_id, false, true, true];
+        } else {
+            return [$order_id, false, false, false];
+        }
+    }
+}

+ 134 - 0
helper/refill/api/yl/cangxin_yi/RefillPhone.php

@@ -0,0 +1,134 @@
+<?php
+
+namespace refill\cangxin_yi;
+
+require_once(BASE_HELPER_RAPI_PATH . '/cangxin_yi/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $phone, int $amount, int $card_type, string $order_sn)
+    {
+        $params['clientId'] = config::clientId;
+        $params['clientOrderNo'] = $order_sn;
+        $params['account'] = $phone;
+        $params['skuCode'] = config::PRODUCT[$card_type][$amount];
+        $params['amount'] = $amount;
+        $params['callbackUrl'] = config::NOTIFY_URL;
+        return $params;
+    }
+
+    public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
+    {
+        $order_sn = $params['order_sn'];
+        $params = $this->req_params($card_no, $amount, $card_type, $order_sn);
+        if(empty($params['skuCode'])) {
+            return [false, '商品编号错误', false];
+        }
+        $sign = $this->sign($params);
+        $params['verifyString'] = $sign;
+
+        $resp = http_request(config::ORDER_URL, $params, 'POST', false, config::ExtHeaders, $net_errno);
+
+        if (empty($resp)) {
+            return [false, '网络错误', true];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误', true];
+            } elseif ($resp['code'] === 200) {
+                return [true, $resp['data']['sysOrderNo'], false];
+            } else {
+                return [false, $resp['msg'], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['clientId'] = config::clientId;
+        $params['clientOrderNo'] = $refill_info['order_sn'];
+        $params['verifyString'] = $this->sign($params);
+
+        $resp = http_request(config::QUERY_URL, $params, 'POST', false, config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            }
+            elseif ($resp['code'] === 200)
+            {
+                $data = $resp['data'];
+                $status = $data['status'];
+                if ($status === '4') {
+                    $updata['official_sn'] = $data['officialOrderNo'];
+                    Model('refill_order')->edit($refill_info['order_id'], $updata);
+                    $order_state = ORDER_STATE_SUCCESS;
+                } elseif ($status === '3') {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif ($status === '0' || $status === '2') {
+                    $order_state = ORDER_STATE_SEND;
+                } else {
+                    return [false, $resp['msg']];
+                }
+                return [true, $order_state];
+            }
+            elseif ($resp['code'] === -9 && (time() - $refill_info['commit_time'] >= 600))
+            {
+                return [true, ORDER_STATE_NOEXIST];
+            }
+            else
+            {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+    public function balance()
+    {
+        $params['clientId'] = config::clientId;
+        $params['verifyString'] = $this->sign($params);
+
+        $resp = http_request(config::BALANCE_URL, $params, 'POST', false, config::ExtHeaders);
+
+        if (empty($resp)) {
+            return [false, '网络错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp)) {
+                return [false, '网络错误'];
+            } elseif ($resp['code'] === 200) {
+                return [true, $resp['data']['balance']];
+            } else {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+    private function sign($params)
+    {
+        ksort($params);
+        $str = urldecode(http_build_query($params));
+        $str .= '&key=' . config::Key;
+        return md5($str);
+    }
+}

+ 0 - 0
helper/refill/api/yl/cangxin_yi/config.php


Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff