瀏覽代碼

add some test channel

stanley-king 3 年之前
父節點
當前提交
68b31db25b
共有 100 個文件被更改,包括 5763 次插入16 次删除
  1. 2 2
      core/framework/libraries/log.php
  2. 52 0
      helper/refill/api/test/afand/RefillCallBack.php
  3. 89 0
      helper/refill/api/test/afand/RefillPhone.php
  4. 20 0
      helper/refill/api/test/afand/config.php
  5. 49 0
      helper/refill/api/test/afandeng/RefillCallBack.php
  6. 78 0
      helper/refill/api/test/afandeng/RefillPhone.php
  7. 13 0
      helper/refill/api/test/afandeng/config.php
  8. 47 0
      helper/refill/api/test/afandfs/RefillCallBack.php
  9. 89 0
      helper/refill/api/test/afandfs/RefillPhone.php
  10. 20 0
      helper/refill/api/test/afandfs/config.php
  11. 19 0
      helper/refill/api/test/afandfs/北京分省账户.txt
  12. 二進制
      helper/refill/api/test/afandfs/阿凡灯分省对接文档.docx
  13. 73 0
      helper/refill/api/test/afandnew/RefillCallBack.php
  14. 91 0
      helper/refill/api/test/afandnew/RefillPhone.php
  15. 14 0
      helper/refill/api/test/afandnew/afd007.txt
  16. 32 0
      helper/refill/api/test/afandnew/config.php
  17. 628 0
      helper/refill/api/test/afandnew/阿凡灯充值系统2.2.doc
  18. 50 0
      helper/refill/api/test/afd/RefillCallBack.php
  19. 93 0
      helper/refill/api/test/afd/RefillPhone.php
  20. 12 0
      helper/refill/api/test/afd/config.php
  21. 13 0
      helper/refill/api/test/afd/账号信息.txt
  22. 二進制
      helper/refill/api/test/afd/阿凡灯系统接口文档.docx
  23. 48 2
      helper/refill/api/test/api.php
  24. 1 12
      helper/refill/api/test/baidu/RefillPhone.php
  25. 75 0
      helper/refill/api/test/bdt/RefillCallBack.php
  26. 71 0
      helper/refill/api/test/bdt/RefillOil.php
  27. 24 0
      helper/refill/api/test/bdt/RefillPhone.php
  28. 17 0
      helper/refill/api/test/bdt/config.php
  29. 59 0
      helper/refill/api/test/beixt/RefillCallBack.php
  30. 94 0
      helper/refill/api/test/beixt/RefillPhone.php
  31. 14 0
      helper/refill/api/test/beixt/config.php
  32. 50 0
      helper/refill/api/test/bingdht/RefillCallBack.php
  33. 109 0
      helper/refill/api/test/bingdht/RefillPhone.php
  34. 11 0
      helper/refill/api/test/bingdht/api.txt
  35. 27 0
      helper/refill/api/test/bingdht/config.php
  36. 52 0
      helper/refill/api/test/bjb/RefillCallBack.php
  37. 98 0
      helper/refill/api/test/bjb/RefillPhone.php
  38. 14 0
      helper/refill/api/test/bjb/config.php
  39. 53 0
      helper/refill/api/test/bjbnew/RefillCallBack.php
  40. 111 0
      helper/refill/api/test/bjbnew/RefillPhone.php
  41. 14 0
      helper/refill/api/test/bjbnew/config.php
  42. 52 0
      helper/refill/api/test/bjbyd/RefillCallBack.php
  43. 96 0
      helper/refill/api/test/bjbyd/RefillPhone.php
  44. 14 0
      helper/refill/api/test/bjbyd/config.php
  45. 58 0
      helper/refill/api/test/bxtwt/RefillCallBack.php
  46. 124 0
      helper/refill/api/test/bxtwt/RefillPhone.php
  47. 14 0
      helper/refill/api/test/bxtwt/config.php
  48. 二進制
      helper/refill/api/test/cangbu/APIdoc直冲.docx
  49. 71 0
      helper/refill/api/test/cangbu/RefillCallBack.php
  50. 144 0
      helper/refill/api/test/cangbu/RefillPhone.php
  51. 6 0
      helper/refill/api/test/cangbu/account.txt
  52. 23 0
      helper/refill/api/test/cangbu/config.php
  53. 二進制
      helper/refill/api/test/cangbukami/APIdoc直冲.docx
  54. 71 0
      helper/refill/api/test/cangbukami/RefillCallBack.php
  55. 144 0
      helper/refill/api/test/cangbukami/RefillPhone.php
  56. 6 0
      helper/refill/api/test/cangbukami/account.txt
  57. 25 0
      helper/refill/api/test/cangbukami/config.php
  58. 68 0
      helper/refill/api/test/feinimoshu/RefillCallBack.php
  59. 134 0
      helper/refill/api/test/feinimoshu/RefillOil.php
  60. 79 0
      helper/refill/api/test/feinimoshu/config.php
  61. 68 0
      helper/refill/api/test/feinimoshu_hf/RefillCallBack.php
  62. 129 0
      helper/refill/api/test/feinimoshu_hf/RefillPhone.php
  63. 46 0
      helper/refill/api/test/feinimoshu_hf/config.php
  64. 72 0
      helper/refill/api/test/fengye/RefillCallBack.php
  65. 116 0
      helper/refill/api/test/fengye/RefillPhone.php
  66. 3 0
      helper/refill/api/test/fengye/api.txt
  67. 21 0
      helper/refill/api/test/fengye/config.php
  68. 51 0
      helper/refill/api/test/fengyeman/RefillCallBack.php
  69. 108 0
      helper/refill/api/test/fengyeman/RefillPhone.php
  70. 7 0
      helper/refill/api/test/fengyeman/api.txt
  71. 21 0
      helper/refill/api/test/fengyeman/config.php
  72. 二進制
      helper/refill/api/test/fengyeman/tel.pdf
  73. 51 0
      helper/refill/api/test/fengyeman24/RefillCallBack.php
  74. 108 0
      helper/refill/api/test/fengyeman24/RefillPhone.php
  75. 8 0
      helper/refill/api/test/fengyeman24/api.txt
  76. 20 0
      helper/refill/api/test/fengyeman24/config.php
  77. 二進制
      helper/refill/api/test/fengyeman24/tel.pdf
  78. 42 0
      helper/refill/api/test/fetch_lingzh/RefillCallBack.php
  79. 56 0
      helper/refill/api/test/fetch_lingzh/RefillOil.php
  80. 9 0
      helper/refill/api/test/fetch_lingzh/config.php
  81. 42 0
      helper/refill/api/test/fetch_zanzan/RefillCallBack.php
  82. 56 0
      helper/refill/api/test/fetch_zanzan/RefillOil.php
  83. 9 0
      helper/refill/api/test/fetch_zanzan/config.php
  84. 113 0
      helper/refill/api/test/gftd/RefillCallBack.php
  85. 226 0
      helper/refill/api/test/gftd/RefillOil.php
  86. 24 0
      helper/refill/api/test/gftd/RefillPhone.php
  87. 18 0
      helper/refill/api/test/gftd/config.php
  88. 113 0
      helper/refill/api/test/gftdsinop/RefillCallBack.php
  89. 226 0
      helper/refill/api/test/gftdsinop/RefillOil.php
  90. 24 0
      helper/refill/api/test/gftdsinop/RefillPhone.php
  91. 18 0
      helper/refill/api/test/gftdsinop/config.php
  92. 50 0
      helper/refill/api/test/guochuang/RefillCallBack.php
  93. 197 0
      helper/refill/api/test/guochuang/RefillPhone.php
  94. 92 0
      helper/refill/api/test/guochuang/config.php
  95. 二進制
      helper/refill/api/test/guochuang/北京国研三网分省调价函.xls
  96. 13 0
      helper/refill/api/test/guochuang/国创新提交地址.txt
  97. 二進制
      helper/refill/api/test/guochuang/接口使用说明V2.0.20200427.pdf
  98. 二進制
      helper/refill/api/test/guochuang/接口签名补充说明.docx
  99. 51 0
      helper/refill/api/test/hongxudagy/RefillCallBack.php
  100. 0 0
      helper/refill/api/test/hongxudagy/RefillPhone.php

+ 2 - 2
core/framework/libraries/log.php

@@ -177,7 +177,7 @@ class Log
 
         if ($this->mAppFile !== false) {
             fwrite($this->mAppFile, $content);
-//            fflush($this->mAppFile);
+            fflush($this->mAppFile);
         }
     }
 
@@ -197,7 +197,7 @@ class Log
 
         if ($this->mAllFile !== false) {
             fwrite($this->mAllFile, $content);
-//            fflush($this->mAllFile);
+            fflush($this->mAllFile);
         }
     }
 

+ 52 - 0
helper/refill/api/test/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];
+        }
+    }
+}

+ 89 - 0
helper/refill/api/test/afand/RefillPhone.php

@@ -0,0 +1,89 @@
+<?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)
+    {
+        sleep(3);
+        return [true , '',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/test/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/test/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];
+        }
+    }
+}

+ 78 - 0
helper/refill/api/test/afandeng/RefillPhone.php

@@ -0,0 +1,78 @@
+<?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)
+    {
+        sleep(3);
+        return [true , '',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/test/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/test/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];
+        }
+    }
+}

+ 89 - 0
helper/refill/api/test/afandfs/RefillPhone.php

@@ -0,0 +1,89 @@
+<?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)
+    {
+        sleep(3);
+        return [true , '',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/test/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/test/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

二進制
helper/refill/api/test/afandfs/阿凡灯分省对接文档.docx


+ 73 - 0
helper/refill/api/test/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];
+        }
+    }
+}

+ 91 - 0
helper/refill/api/test/afandnew/RefillPhone.php

@@ -0,0 +1,91 @@
+<?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)
+    {
+        sleep(3);
+        return [true , '',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/test/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/test/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/test/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/test/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];
+        }
+    }
+}

+ 93 - 0
helper/refill/api/test/afd/RefillPhone.php

@@ -0,0 +1,93 @@
+<?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)
+    {
+        sleep(3);
+        return [true , '',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/test/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/test/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

二進制
helper/refill/api/test/afd/阿凡灯系统接口文档.docx


+ 48 - 2
helper/refill/api/test/api.php

@@ -1,4 +1,50 @@
 <?php
 
-require_once(BASE_HELPER_RAPI_PATH . '/baidu/RefillPhone.php');
-require_once(BASE_HELPER_RAPI_PATH . '/baidu/RefillCallBack.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');

+ 1 - 12
helper/refill/api/test/baidu/RefillPhone.php

@@ -31,18 +31,7 @@ class RefillPhone extends refill\IRefillPhone
 
     public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
     {
-        Log::record("start request",Log::DEBUG);
-        sleep(1);
-        $status = mt_rand(0,5);
-        if($status > 3) {
-            $status = 1;
-        } else {
-            $status = 0;
-        }
-
-        $resp = http_request(config::NOTIFY_URL,['status' => $status,'order_sn' => $params['order_sn']]);
-
-        Log::record("resp={$resp}",Log::DEBUG);
+        sleep(3);
         return [true , '',false];
     }
 

+ 75 - 0
helper/refill/api/test/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];
+        }
+    }
+}

+ 71 - 0
helper/refill/api/test/bdt/RefillOil.php

@@ -0,0 +1,71 @@
+<?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)
+    {
+        sleep(3);
+        return [true , '',false];
+    }
+
+    public function query($refill_info)
+    {
+
+    }
+
+    public function balance()
+    {
+        return [false, '暂无余额接口'];
+    }
+}

+ 24 - 0
helper/refill/api/test/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/test/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/test/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];
+        }
+    }
+}

+ 94 - 0
helper/refill/api/test/beixt/RefillPhone.php

@@ -0,0 +1,94 @@
+<?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)
+    {
+        sleep(3);
+        return [true , '',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/test/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/test/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];
+        }
+    }
+}

+ 109 - 0
helper/refill/api/test/bingdht/RefillPhone.php

@@ -0,0 +1,109 @@
+<?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)
+    {
+        sleep(3);
+        return [true , '',false];
+    }
+
+    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 = intval($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])) {
+                $order_state = ORDER_STATE_SEND;
+            } elseif ($status === 5005 && (time() - $refill_info['commit_time'] >= 300)) {
+                $order_state = ORDER_STATE_NOEXIST;
+            } else {
+                return [false, $status];
+            }
+            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/test/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/test/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_NO = [
+        1000,1001,1003,1004,2001,2002,2003,2020,2021,1006,2030,3003
+    ];
+}

+ 52 - 0
helper/refill/api/test/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/test/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/test/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/test/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];
+        }
+    }
+}

+ 111 - 0
helper/refill/api/test/bjbnew/RefillPhone.php

@@ -0,0 +1,111 @@
+<?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 = $this->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 = $this->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);
+    }
+
+    private function xmlToArray($xml)
+    {
+        //禁止引用外部xml实体
+        libxml_disable_entity_loader(true);
+
+        $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
+
+        $val = json_decode(json_encode($xmlstring), true);
+
+        return $val;
+
+    }
+}

+ 14 - 0
helper/refill/api/test/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/test/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/test/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/test/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/test/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/test/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/test/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;
+}

二進制
helper/refill/api/test/cangbu/APIdoc直冲.docx


+ 71 - 0
helper/refill/api/test/cangbu/RefillCallBack.php

@@ -0,0 +1,71 @@
+<?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/test/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 == 'success') {
+                    $order_state = ORDER_STATE_SUCCESS;
+                } elseif ($status == 'failed') {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif ($status == 'wait') {
+                    $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/test/cangbu/account.txt

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

+ 23 - 0
helper/refill/api/test/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'];
+}

二進制
helper/refill/api/test/cangbukami/APIdoc直冲.docx


+ 71 - 0
helper/refill/api/test/cangbukami/RefillCallBack.php

@@ -0,0 +1,71 @@
+<?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/test/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 == 'success') {
+                    $order_state = ORDER_STATE_SUCCESS;
+                } elseif ($status == 'failed') {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif ($status == 'wait') {
+                    $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/test/cangbukami/account.txt

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

+ 25 - 0
helper/refill/api/test/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'];
+}

+ 68 - 0
helper/refill/api/test/feinimoshu/RefillCallBack.php

@@ -0,0 +1,68 @@
+<?php
+
+
+namespace refill\feinimoshu;
+
+require_once(BASE_HELPER_RAPI_PATH . '/feinimoshu/config.php');
+
+use refill;
+
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $input = $params;
+        unset($input['signature']);
+        $sign = $this->sign($input);
+        if ($params['appid'] == config::APPID && $params['signature'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    protected function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+
+    private function sign($input)
+    {
+        $key = config::APPKEY;
+        $body = config::body($input);
+        $body .= "&token={$key}";
+
+        return strtolower(md5($body));
+    }
+
+    //[$order_id, $success, $can_try, $need_handle]
+    public function notify($params)
+    {
+        $status = intval($params['status']);
+        $order_sn = $params['morder'];
+        $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['vnum']) == 'null' ? '' : $params['vnum'];
+            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/test/feinimoshu/RefillOil.php

@@ -0,0 +1,134 @@
+<?php
+namespace refill\feinimoshu;
+
+require_once(BASE_HELPER_RAPI_PATH . '/feinimoshu/config.php');
+
+use refill;
+use Log;
+
+class RefillOil extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $card_no, int $card_type, int $amount, string $order_sn)
+    {
+        $params['appid'] = config::APPID;
+        $params['notify'] = config::NOTIFY_URL;
+        $params['card'] = $card_no;
+        $params['order'] = $order_sn;
+
+        $producd = config::getProduct($card_type, $amount);
+        if ($producd == false) {
+            Log::record("找不到合适的产品",Log::ERR);
+            return false;
+        } else {
+            $params['proid'] = $producd;
+            return $params;
+        }
+    }
+
+
+    public function add($card_no, $card_type,$amount,$input,&$net_errno = 0)
+    {
+        $order_sn = $input['order_sn'];
+        $params = $this->req_params($card_no,$card_type,$amount,$order_sn);
+        if(empty($params)) {
+            return [false,"上游{$this->name()}产品不支持:{$card_type}-{$amount}",true];
+        }
+
+        $sign = $this->sign($params);
+        $params['signature'] = $sign;
+
+        $resp = http_request(config::ORDER_URL,$params,'GET',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'] == 1) {
+                return [true, $resp['data']['order'], false];
+            } else {
+                return [false, $resp['info'], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['appid'] = config::APPID;
+        $params['morder'] = $refill_info['order_sn'];
+        $sign = $this->sign($params);
+        $params['signature'] = $sign;
+
+        $resp = http_request(config::QUERY_URL,$params);
+        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']);
+            $status = intval($resp['data']['status']);
+
+            if ($code != 1) {
+                return [false, $resp['info']];
+            } elseif ($status == 2) {
+                $order_state = ORDER_STATE_SUCCESS;
+                $data['official_sn'] = strtolower($params['vnum']) == 'null' ? '' : $params['vnum'];
+                Model('refill_order')->edit($refill_info['order_id'], $data);
+            } elseif ($status == 3) {
+                $order_state = ORDER_STATE_CANCEL;
+            } else {
+                $order_state = ORDER_STATE_SEND;
+            }
+
+            return [true, $order_state];
+        }
+    }
+
+    public function balance()
+    {
+        $params['appid'] = config::APPID;
+        $sign = $this->sign($params);
+        $params['signature'] = $sign;
+
+        $resp = http_request(config::BALANCE_URL, $params);
+        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']['account']];
+            } else {
+                return [false, $resp['info']];
+            }
+        }
+    }
+
+    private function sign($input)
+    {
+        $key = config::APPKEY;
+        $body = config::body($input);
+        $body .= "&token={$key}";
+
+        return strtolower(md5($body));
+    }
+}

+ 79 - 0
helper/refill/api/test/feinimoshu/config.php

@@ -0,0 +1,79 @@
+<?php
+
+
+namespace refill\feinimoshu;
+
+use mtopcard;
+class config
+{
+    const CHANNEL_HOST = 'http://122.114.168.35';
+    const ORDER_URL = config::CHANNEL_HOST . '/gateway/api.run/submit';
+    const QUERY_URL = config::CHANNEL_HOST . '/gateway/api.run/order';
+    const BALANCE_URL = config::CHANNEL_HOST . '/gateway/api.run/account';
+
+    const APPID = 'CZ30533982';
+    const APPKEY = 'lvrg4xoqvrozuq2irjza2a6dlenrsv';
+    const NOTIFY_URL = BASE_SITE_URL . "/mobile/callback/refill_feinimoshu.php";
+
+    static function getProduct($card_type,$amount)
+    {
+        if ($card_type == mtopcard\PetroChinaCard)
+        {
+            switch ($amount) {
+                case 50: return 10006;
+                case 100: return 10007;
+                case 200: return 10008;
+                case 500: return 10009;
+                case 1000: return 10010;
+                case 2000: return 10011;
+                default: return false;
+            }
+        }
+        elseif ($card_type == mtopcard\SinopecCard) {
+            switch ($amount) {
+                case 50: return 10000;
+                case 100: return 10001;
+                case 200: return 10002;
+                case 500: return 10003;
+                case 1000: return 10004;
+                case 2000: return 10005;
+                default: return false;
+            }
+        }
+        else {
+            return false;
+        }
+    }
+
+    public static function body($params)
+    {
+        ksort($params);
+        $body = "";
+        $i = 0;
+        foreach ($params as $k => $v)
+        {
+            if (false === self::check_empty($v) && "@" != substr($v, 0, 1))
+            {
+                if ($i == 0) {
+                    $body .= "{$k}" . "=" . urlencode($v);
+                } else {
+                    $body .= "&" . "{$k}" . "=" . urlencode($v);
+                }
+                $i++;
+            }
+        }
+        return $body;
+    }
+
+    private static function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+}

+ 68 - 0
helper/refill/api/test/feinimoshu_hf/RefillCallBack.php

@@ -0,0 +1,68 @@
+<?php
+
+
+namespace refill\feinimoshu_hf;
+
+require_once(BASE_HELPER_RAPI_PATH . '/feinimoshu_hf/config.php');
+
+use refill;
+
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $input = $params;
+        unset($input['signature']);
+        $sign = $this->sign($input);
+        if ($params['appid'] == config::APPID && $params['signature'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    protected function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+
+    private function sign($input)
+    {
+        $key = config::APPKEY;
+        $input['token'] = $key;
+        $body = config::body($input);
+
+        return strtolower(md5($body));
+    }
+
+    //[$order_id, $success, $can_try, $need_handle]
+    public function notify($params)
+    {
+        $status = intval($params['status']);
+        $order_sn = $params['morder'];
+        $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['vnum']) == 'null' ? '' : $params['vnum'];
+            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];
+        }
+    }
+}

+ 129 - 0
helper/refill/api/test/feinimoshu_hf/RefillPhone.php

@@ -0,0 +1,129 @@
+<?php
+namespace refill\feinimoshu_hf;
+
+require_once(BASE_HELPER_RAPI_PATH . '/feinimoshu_hf/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    private function req_params(int $card_no, int $amount, string $order_sn)
+    {
+        $params['appid'] = config::APPID;
+        $params['notify'] = config::NOTIFY_URL;
+        $params['card'] = $card_no;
+        $params['order'] = $order_sn;
+        $params['cash'] = $amount;
+        $params['proid'] = 10012;
+
+        return $params;
+    }
+
+
+    public function add($card_no, $card_type,$amount,$input,&$net_errno = 0)
+    {
+        $order_sn = $input['order_sn'];
+        $params = $this->req_params($card_no,$amount,$order_sn);
+
+        $sign = $this->sign($params);
+        $params['signature'] = $sign;
+
+        $resp = http_request(config::ORDER_URL,$params,'GET',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'] == 1) {
+                return [true, $resp['data']['order'], false];
+            } else {
+                return [false, $resp['info'], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['appid'] = config::APPID;
+        $params['morder'] = $refill_info['order_sn'];
+        $sign = $this->sign($params);
+        $params['signature'] = $sign;
+
+        $resp = http_request(config::QUERY_URL,$params);
+        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']);
+            $status = intval($resp['data']['status']);
+
+            if ($code != 1) {
+                return [false, $resp['info']];
+            } elseif ($status == 2) {
+                $order_state = ORDER_STATE_SUCCESS;
+                $data['official_sn'] = strtolower($params['vnum']) == 'null' ? '' : $params['vnum'];
+                Model('refill_order')->edit($refill_info['order_id'], $data);
+            } elseif ($status == 3) {
+                $order_state = ORDER_STATE_CANCEL;
+            } else {
+                $order_state = ORDER_STATE_SEND;
+            }
+
+            return [true, $order_state];
+        }
+    }
+
+    public function balance()
+    {
+        $params['appid'] = config::APPID;
+        $sign = $this->sign($params);
+        $params['signature'] = $sign;
+
+        $resp = http_request(config::BALANCE_URL,$params);
+        if($resp === false) {
+            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']['account']];
+            }
+            else
+            {
+                return [false, $resp['info']];
+            }
+        }
+    }
+
+    private function sign($input)
+    {
+        $key = config::APPKEY;
+        $body = config::body($input);
+        $body .= "&token={$key}";
+
+        return strtolower(md5($body));
+    }
+}

+ 46 - 0
helper/refill/api/test/feinimoshu_hf/config.php

@@ -0,0 +1,46 @@
+<?php
+
+namespace refill\feinimoshu_hf;
+class config
+{
+    const CHANNEL_HOST = 'http://122.114.168.35';
+    const ORDER_URL = config::CHANNEL_HOST . '/gateway/api.run/submit';
+    const QUERY_URL = config::CHANNEL_HOST . '/gateway/api.run/order';
+    const BALANCE_URL = config::CHANNEL_HOST . '/gateway/api.run/account';
+
+    const APPID = 'CZ30533982';
+    const APPKEY = 'lvrg4xoqvrozuq2irjza2a6dlenrsv';
+    const NOTIFY_URL = BASE_SITE_URL . "/mobile/callback/refill_feinimoshu_hf.php";
+
+    public static function body($params)
+    {
+        ksort($params);
+        $body = "";
+        $i = 0;
+        foreach ($params as $k => $v)
+        {
+            if (false === self::check_empty($v) && "@" != substr($v, 0, 1))
+            {
+                if ($i == 0) {
+                    $body .= "{$k}" . "=" . urlencode($v);
+                } else {
+                    $body .= "&" . "{$k}" . "=" . urlencode($v);
+                }
+                $i++;
+            }
+        }
+        return $body;
+    }
+
+    private static function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+}

+ 72 - 0
helper/refill/api/test/fengye/RefillCallBack.php

@@ -0,0 +1,72 @@
+<?php
+
+
+namespace refill\fengye;
+
+require_once(BASE_HELPER_RAPI_PATH . '/fengye/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;
+        }
+    }
+
+    protected function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+
+    private function sign($data)
+    {
+        $str = "";
+        ksort($data);
+        $data['queryUrl'] = urlencode($data['queryUrl']);
+        foreach($data as $k => $v){
+            if($this->check_empty($v) === false){
+                $str .= $v;
+            }
+        }
+        return md5($str.config::KEY);
+    }
+
+    //[$order_id, $success, $can_try, $need_handle]
+    public function notify($params)
+    {
+        $status = intval($params['status']);
+        $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'];
+
+        if ($status === 2) {
+            $data['official_sn'] = strtolower($params['ticketNo']) == 'null' ? '' : $params['ticketNo'];
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false,true];
+        }
+        elseif (in_array($status, [0,1,3])) {
+            return [$order_id, false, true,true];
+        }
+        else {
+            return [$order_id, false, false,false];
+        }
+    }
+}

+ 116 - 0
helper/refill/api/test/fengye/RefillPhone.php

@@ -0,0 +1,116 @@
+<?php
+
+namespace refill\fengye;
+
+require_once(BASE_HELPER_RAPI_PATH . '/fengye/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['supplierId'] = config::USER_ID;
+        $params['orderNo'] = $order_sn;
+        $params['company'] = config::operator[$card_type];
+        $params['amount'] = $amount;
+        $params['phoneNo'] = $phone;
+        $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, $card_type, $params['order_sn']);
+        $sign = $this->sign($params);
+        $params['sign'] = $sign;
+
+        $params = json_encode($params);
+
+        $resp = http_post_data(config::ORDER_URL, $params , 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']['orderId'], false];
+            } else {
+                return [false, $resp['msg'], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['supplierId'] = config::USER_ID;
+        $params['orderNo'] = $refill_info['order_sn'];
+        $params['phoneNo'] = $refill_info['card_no'];
+        $params['company'] = config::operator[$refill_info['card_type']];
+        $params['sign'] = $this->sign($params);
+        $params = json_encode($params);
+
+        $resp = http_post_data(config::QUERY_URL, $params , 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)
+            {
+                $status = intval($resp['data']['status']);
+                if ($status === 2) {
+                    $updata['official_sn'] = $resp['data']['ticketNo'];
+                    Model('refill_order')->edit($refill_info['order_id'], $updata);
+                    $order_state = ORDER_STATE_SUCCESS;
+                } elseif ($status === 3) {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif (in_array($status, [0,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($data)
+    {
+        $str = "";
+        ksort($data);
+        foreach($data as $k => $v){
+            if($this->check_empty($v) === false){
+                $str .= $v;
+            }
+        }
+        return md5($str.config::KEY);
+    }
+}

+ 3 - 0
helper/refill/api/test/fengye/api.txt

@@ -0,0 +1,3 @@
+后台:http://47.118.36.120/supplier/
+账号:yzdz02    
+密码:12345678

+ 21 - 0
helper/refill/api/test/fengye/config.php

@@ -0,0 +1,21 @@
+<?php
+
+
+namespace refill\fengye;
+
+use mtopcard;
+class config
+{
+    const ORDER_URL = 'http://47.118.36.120:9009/prod-produce/api/provide';
+    const QUERY_URL = 'http://47.118.36.120:9009/prod-produce/api/query';
+
+    const USER_ID = '13';
+    const KEY = '2579695a64e30345e23fdb53aebb7b6c';
+    const NOTIFY_URL = BASE_SITE_URL . "/mobile/callback/refill_fengye.php";
+    const ExtHeaders = ['Content-Type: application/json'];
+    const operator = [
+        mtopcard\ChinaMobileCard  => 'yd',
+        mtopcard\ChinaUnicomCard  => 'lt',
+        mtopcard\ChinaTelecomCard => 'dx'
+    ];
+}

+ 51 - 0
helper/refill/api/test/fengyeman/RefillCallBack.php

@@ -0,0 +1,51 @@
+<?php
+namespace refill\fengyeman;
+
+require_once(BASE_HELPER_RAPI_PATH . '/fengyeman/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['order_id'] . $params['out_order_id'] . config::MCHID . $params['tel'] . $params['price'];
+        $content .= $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['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['out_order_id']) == 'null' ? '' : $params['out_order_id'];
+
+        if ($status === 1) {
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false,true];
+        }
+        elseif (in_array($status, [2,3])) {
+            return [$order_id, false, true,true];
+        }
+        else {
+            return [$order_id, false, false,false];
+        }
+    }
+}

+ 108 - 0
helper/refill/api/test/fengyeman/RefillPhone.php

@@ -0,0 +1,108 @@
+<?php
+
+namespace refill\fengyeman;
+
+require_once(BASE_HELPER_RAPI_PATH . '/fengyeman/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['mchid'] = config::MCHID;
+        $params['tel'] = $phone;
+        $params['orderid'] = $order_sn;
+        $params['price'] = $amount;
+        $params['teltype'] = config::operator[$card_type];
+        $params['timeout'] = config::TIMEOUT;
+        $params['notify'] = config::NOTIFY_URL;
+        $params['time'] = time();
+        $params['rand'] = rand(100000,999999);
+
+        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'] == 0) {
+                return [true, $resp['order_id'], false];
+            } else {
+                return [false, $resp['msg'], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['mchid'] = config::MCHID;
+        $params['orderid'] = $refill_info['order_sn'];
+        $content = $params['mchid'] . $params['orderid'] . 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'] == 100)
+            {
+                if ($resp['status'] == 3 && $resp['arrival'] == 2) {
+                    $order_state = ORDER_STATE_SUCCESS;
+                    $save['official_sn'] = strtolower($resp['out_order_id']) == 'null' ? '' : $resp['out_order_id'];
+                    Model('refill_order')->edit($refill_info['order_id'], $save);
+                } elseif ($resp['status'] == 4) {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif (in_array($resp['status'] , [1 , 2])) {
+                    $order_state = ORDER_STATE_SEND;
+                } else {
+                    return [false, "msg:{$resp['msg']},status:{$resp['status']},arrival:{$resp['arrival']}"];
+                }
+
+                return [true, $order_state];
+            }
+            else {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+    public function balance()
+    {
+        return [false, '暂无余额接口'];
+    }
+
+    private function sign($params)
+    {
+        $content  = $params['mchid'] . $params['tel'] . $params['price'] . $params['orderid'] . $params['teltype'] . $params['timeout'] . $params['notify'];
+        $content .= $params['time'] . $params['rand'] . config::KEY;
+        return md5($content);
+    }
+}

+ 7 - 0
helper/refill/api/test/fengyeman/api.txt

@@ -0,0 +1,7 @@
+话费慢充系统 对接资料:
+登录地址:http://103.66.58.75:9998/dist/   
+网关地址:http://103.66.58.75:9998/api/pay/telpay
+商户名称:椰子电子
+商户ID:HF67a65_10008
+商户密码:a12345678
+商户密钥:8dd6f67a65b806fbfb74dde74c5f1550

+ 21 - 0
helper/refill/api/test/fengyeman/config.php

@@ -0,0 +1,21 @@
+<?php
+namespace refill\fengyeman;
+
+use mtopcard;
+class config
+{
+    const ORDER_URL = 'http://103.66.58.75:9998/api/pay/telpay';
+    const QUERY_URL = 'http://103.66.58.75:9998/api/pay/telpay/query';
+    const BALANCE_URL = 'http://103.66.58.75:9998/api/pay/telpay/balance';
+
+    const MCHID = 'HF67a65_10008';
+    const KEY = '8dd6f67a65b806fbfb74dde74c5f1550';
+    const NOTIFY_URL = BASE_SITE_URL . "/mobile/callback/refill_fengyeman.php";
+    const ExtHeaders = ['Content-Type: application/x-www-form-urlencoded'];
+    const TIMEOUT = 18000;
+    const operator = [
+        mtopcard\ChinaMobileCard  => 0,
+        mtopcard\ChinaUnicomCard  => 1,
+        mtopcard\ChinaTelecomCard => 2
+    ];
+}

二進制
helper/refill/api/test/fengyeman/tel.pdf


+ 51 - 0
helper/refill/api/test/fengyeman24/RefillCallBack.php

@@ -0,0 +1,51 @@
+<?php
+namespace refill\fengyeman24;
+
+require_once(BASE_HELPER_RAPI_PATH . '/fengyeman24/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['order_id'] . $params['out_order_id'] . config::MCHID . $params['tel'] . $params['price'];
+        $content .= $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['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['out_order_id']) == 'null' ? '' : $params['out_order_id'];
+
+        if ($status === 1) {
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false,true];
+        }
+        elseif (in_array($status, [2,3])) {
+            return [$order_id, false, true,true];
+        }
+        else {
+            return [$order_id, false, false,false];
+        }
+    }
+}

+ 108 - 0
helper/refill/api/test/fengyeman24/RefillPhone.php

@@ -0,0 +1,108 @@
+<?php
+
+namespace refill\fengyeman24;
+
+require_once(BASE_HELPER_RAPI_PATH . '/fengyeman24/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['mchid'] = config::MCHID;
+        $params['tel'] = $phone;
+        $params['orderid'] = $order_sn;
+        $params['price'] = $amount;
+        $params['teltype'] = config::operator[$card_type];
+        $params['timeout'] = config::TIMEOUT;
+        $params['notify'] = config::NOTIFY_URL;
+        $params['time'] = time();
+        $params['rand'] = rand(100000,999999);
+
+        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'] == 0) {
+                return [true, $resp['order_id'], false];
+            } else {
+                return [false, $resp['msg'], false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        $params['mchid'] = config::MCHID;
+        $params['orderid'] = $refill_info['order_sn'];
+        $content = $params['mchid'] . $params['orderid'] . 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'] == 100)
+            {
+                if ($resp['status'] == 3 && $resp['arrival'] == 2) {
+                    $order_state = ORDER_STATE_SUCCESS;
+                    $save['official_sn'] = strtolower($resp['out_order_id']) == 'null' ? '' : $resp['out_order_id'];
+                    Model('refill_order')->edit($refill_info['order_id'], $save);
+                } elseif ($resp['status'] == 4) {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif (in_array($resp['status'] , [1 , 2])) {
+                    $order_state = ORDER_STATE_SEND;
+                } else {
+                    return [false, "msg:{$resp['msg']},status:{$resp['status']},arrival:{$resp['arrival']}"];
+                }
+
+                return [true, $order_state];
+            }
+            else {
+                return [false, $resp['msg']];
+            }
+        }
+    }
+
+    public function balance()
+    {
+        return [false, '暂无余额接口'];
+    }
+
+    private function sign($params)
+    {
+        $content  = $params['mchid'] . $params['tel'] . $params['price'] . $params['orderid'] . $params['teltype'] . $params['timeout'] . $params['notify'];
+        $content .= $params['time'] . $params['rand'] . config::KEY;
+        return md5($content);
+    }
+}

+ 8 - 0
helper/refill/api/test/fengyeman24/api.txt

@@ -0,0 +1,8 @@
+话费慢充系统 对接资料:
+登录地址:http://103.66.58.75:9998/dist/   
+网关地址:http://103.66.58.75:9998/api/pay/telpay
+商户名称:椰子电子24h
+商户ID:HFd6b6f_10009
+商户密码:a12345678
+商户密钥:8a8abd6b6fc3a34dd0be7d9f20f1ddc9
+【登录后台后需绑定好谷歌验证器,刷新后正常。对接文档在后台】

+ 20 - 0
helper/refill/api/test/fengyeman24/config.php

@@ -0,0 +1,20 @@
+<?php
+namespace refill\fengyeman24;
+
+use mtopcard;
+class config
+{
+    const ORDER_URL = 'http://103.66.58.75:9998/api/pay/telpay';
+    const QUERY_URL = 'http://103.66.58.75:9998/api/pay/telpay/query';
+
+    const MCHID = 'HFd6b6f_10009';
+    const KEY = '8a8abd6b6fc3a34dd0be7d9f20f1ddc9';
+    const NOTIFY_URL = BASE_SITE_URL . "/mobile/callback/refill_fengyeman24.php";
+    const ExtHeaders = ['Content-Type: application/x-www-form-urlencoded'];
+    const TIMEOUT = 82800;
+    const operator = [
+        mtopcard\ChinaMobileCard  => 0,
+        mtopcard\ChinaUnicomCard  => 1,
+        mtopcard\ChinaTelecomCard => 2
+    ];
+}

二進制
helper/refill/api/test/fengyeman24/tel.pdf


+ 42 - 0
helper/refill/api/test/fetch_lingzh/RefillCallBack.php

@@ -0,0 +1,42 @@
+<?php
+
+
+namespace refill\fetch_lingzh;
+
+require_once(BASE_HELPER_RAPI_PATH . '/fetch_lingzh/config.php');
+
+
+use refill;
+
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        return true;
+    }
+
+    public function notify($params)
+    {
+        $order_sn = $params['order_sn'];
+        $state = $params['state'];
+        $official_sn = $params['official_sn'] ?? '';
+
+
+        $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 ($state === 'SUCCESS') {
+            Model('refill_order')->edit($order_id, ['official_sn' => $official_sn]);
+            return [$order_id, true, false,true];
+        }
+        elseif ($state === 'CANCEL') {
+            return [$order_id, false, true,true];
+        }
+        else {
+            return [$order_id, false, false,false];
+        }
+    }
+}

+ 56 - 0
helper/refill/api/test/fetch_lingzh/RefillOil.php

@@ -0,0 +1,56 @@
+<?php
+
+namespace refill\fetch_lingzh;
+
+require_once(BASE_HELPER_RAPI_PATH . '/fetch_lingzh/config.php');
+
+use refill;
+
+class RefillOil extends refill\IRefillOil
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
+    {
+        $mod_fetch = Model('fetch_order');
+        $count = $mod_fetch->store_order_count($this->store_id());
+        return [config::PROCESS_ABILITY >= $count, '',false];
+    }
+
+    public function query($refill_info)
+    {
+        $order_sn = $refill_info['order_sn'];
+        $store_id = $this->store_id();
+
+        $mod_fetch = Model('fetch_order');
+        $order = $mod_fetch->order_info(['order_sn' => $order_sn,'store_id' => $store_id],'*',true);
+        if(empty($order)) {
+            return [true, ORDER_STATE_NOEXIST];
+        }
+
+        $fetch_status = intval($order['fetch_status']);
+        $fetch_result = $order['fetch_result'];
+        $official_sn = $order['official_sn'];
+
+        if ($fetch_status == 0) {
+            $order_state = ORDER_STATE_CANCEL;
+        } elseif ($fetch_status == 1 || $fetch_status == 2) {
+            $order_state = ORDER_STATE_SEND;
+        } elseif ($fetch_result == "SUCCESS") {
+            $order_state = ORDER_STATE_SUCCESS;
+            Model('refill_order')->edit($refill_info['order_id'], ['official_sn' => $official_sn]);
+        } else {
+            $order_state = ORDER_STATE_CANCEL;
+        }
+
+        return [true, $order_state];
+    }
+
+    public function balance()
+    {
+        return [false, '暂无余额接口'];
+    }
+}

+ 9 - 0
helper/refill/api/test/fetch_lingzh/config.php

@@ -0,0 +1,9 @@
+<?php
+
+
+namespace refill\fetch_lingzh;
+
+class config
+{
+    const PROCESS_ABILITY = 100;
+}

+ 42 - 0
helper/refill/api/test/fetch_zanzan/RefillCallBack.php

@@ -0,0 +1,42 @@
+<?php
+
+
+namespace refill\fetch_zanzan;
+
+require_once(BASE_HELPER_RAPI_PATH . '/fetch_zanzan/config.php');
+
+
+use refill;
+
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        return true;
+    }
+
+    public function notify($params)
+    {
+        $order_sn = $params['order_sn'];
+        $state = $params['state'];
+        $official_sn = $params['official_sn'] ?? '';
+
+
+        $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 ($state === 'SUCCESS') {
+            Model('refill_order')->edit($order_id, ['official_sn' => $official_sn]);
+            return [$order_id, true, false,true];
+        }
+        elseif ($state === 'CANCEL') {
+            return [$order_id, false, true,true];
+        }
+        else {
+            return [$order_id, false, false,false];
+        }
+    }
+}

+ 56 - 0
helper/refill/api/test/fetch_zanzan/RefillOil.php

@@ -0,0 +1,56 @@
+<?php
+
+namespace refill\fetch_zanzan;
+
+require_once(BASE_HELPER_RAPI_PATH . '/fetch_zanzan/config.php');
+
+use refill;
+
+class RefillOil extends refill\IRefillOil
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
+    {
+        $mod_fetch = Model('fetch_order');
+        $count = $mod_fetch->store_order_count($this->store_id());
+        return [config::PROCESS_ABILITY >= $count, '',false];
+    }
+
+    public function query($refill_info)
+    {
+        $order_sn = $refill_info['order_sn'];
+        $store_id = $this->store_id();
+
+        $mod_fetch = Model('fetch_order');
+        $order = $mod_fetch->order_info(['order_sn' => $order_sn,'store_id' => $store_id],'*',true);
+        if(empty($order)) {
+            return [true, ORDER_STATE_NOEXIST];
+        }
+
+        $fetch_status = intval($order['fetch_status']);
+        $fetch_result = $order['fetch_result'];
+        $official_sn = $order['official_sn'];
+
+        if ($fetch_status == 0) {
+            $order_state = ORDER_STATE_CANCEL;
+        } elseif ($fetch_status == 1 || $fetch_status == 2) {
+            $order_state = ORDER_STATE_SEND;
+        } elseif ($fetch_result == "SUCCESS") {
+            $order_state = ORDER_STATE_SUCCESS;
+            Model('refill_order')->edit($refill_info['order_id'], ['official_sn' => $official_sn]);
+        } else {
+            $order_state = ORDER_STATE_CANCEL;
+        }
+
+        return [true, $order_state];
+    }
+
+    public function balance()
+    {
+        return [false, '暂无余额接口'];
+    }
+}

+ 9 - 0
helper/refill/api/test/fetch_zanzan/config.php

@@ -0,0 +1,9 @@
+<?php
+
+
+namespace refill\fetch_zanzan;
+
+class config
+{
+    const PROCESS_ABILITY = 100;
+}

+ 113 - 0
helper/refill/api/test/gftd/RefillCallBack.php

@@ -0,0 +1,113 @@
+<?php
+
+
+namespace refill\gftd;
+
+require_once(BASE_HELPER_RAPI_PATH . '/gftd/config.php');
+
+
+use refill;
+
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $input = $params;
+        unset($input['signature']);
+
+        $sign = $this->sign($input);
+        if ($params['signature'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        $body = $this->body($params);
+        $body .= config::APP_SECRET;
+
+        return md5($body);
+    }
+
+    protected function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+
+    private function body($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}" . "=" . $v;
+                } else {
+                    $body .= "&" . "{$k}" . "=" . $v;
+                }
+                $i++;
+            }
+        }
+        return $body;
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['status']);
+
+        $order_sn = $params['channelOrderNumber'];
+        $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['voucher'];
+        $data['ch_trade_no'] = $params['orderNumber'];
+        $data['err_msg'] = $params['message'];
+
+        Model('refill_order')->edit($order_id, $data);
+
+        //[$order_id, 成功失败, 是否能重试,接下来是否需要处理]
+        if ($status === 101) {
+            return [$order_id, true, false, true];
+        } elseif ($status === 109) {
+            $this->onError($params['message'], $order_id);
+            return [$order_id, false, true, true];
+        } elseif ($status === 120) {
+            return [$order_id, false, false, false];
+        } else {
+            return [$order_id, false, false, false];
+        }
+    }
+
+    public function onError($msg,$order_id)
+    {
+        if(in_array($msg,config::BlackMsgs))
+        {
+            $refill = Model('refill_order');
+            $order = $refill->getOrderInfo(['order_id' => $order_id]);
+
+            if(empty($order)) return false;
+
+            $card_no = $order['card_no'];
+            if(!empty($card_no)) {
+                refill\util::set_black($card_no);
+                return true;
+            }
+        }
+
+        return false;
+    }
+}

+ 226 - 0
helper/refill/api/test/gftd/RefillOil.php

@@ -0,0 +1,226 @@
+<?php
+
+
+namespace refill\gftd;
+
+require_once(BASE_HELPER_RAPI_PATH . '/gftd/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['appid'] = config::APP_ID;
+        $params['ts'] = time();
+
+        $params['productId'] = $this->product_id($amount,$card_type);
+        $params['outOrderNumber'] = $other['order_sn'];
+        $params['fuelCardNumber'] = $card_no;
+
+        $params['fuelCardUserName'] = "";
+        $params['fuelCardUserID'] = "";
+
+        $card_info = refill\util::read_card($card_no,$card_type);
+
+        $params['telephone'] = $card_info['bind_phone'];
+        $params['phoneNumber'] = $card_info['bind_phone'];
+
+        return [$params, $card_info];
+    }
+
+    private function product_id(int $amount,int $cart_type)
+    {
+        if($cart_type === mtopcard\PetroChinaCard)
+        {
+            switch ($amount) {
+                case 100: return 1;
+                case 200: return 2;
+                case 500: return 3;
+                case 1000: return 4;
+            }
+        }
+        else
+        {
+            switch ($amount) {
+                case 100: return 5;
+                case 200: return 6;
+                case 500: return 7;
+                case 1000: return 8;
+            }
+        }
+
+        return false;
+    }
+
+    private function sign($params)
+    {
+        $body = $this->body($params);
+        $body .= config::APP_SECRET;
+
+        return md5($body);
+    }
+
+    protected function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+
+    private function body($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}" . "=" . $v;
+                } else {
+                    $body .= "&" . "{$k}" . "=" . $v;
+                }
+
+                $i++;
+            }
+        }
+        return $body;
+    }
+
+    public function add($card_no,$card_type,$amount,$input,&$net_errno = 0)
+    {
+        [$params,$card_info] = $this->req_params($card_no,$card_type,$amount,$input);
+
+        $sign = $this->sign($params);
+        $params['signature'] = $sign;
+
+        $uri = config::ORDER_URL . "/fuelRecharge/create";
+        $resp = http_post_data($uri,json_encode($params), 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'] == 0)
+            {
+                refill\util::inc_card($card_no,$card_info);
+                $data = $resp['data'];
+                return [true,$data['orderNumber'], false];
+            }
+            else {
+                return [false,$resp['message'], false];
+            }
+        }
+    }
+
+    private function query_params($order_sn)
+    {
+        $params['appid'] = config::APP_ID;
+        $params['ts'] = time();
+        $params['outOrderNumber'] = $order_sn;
+
+        return $params;
+    }
+
+    public function query($refill_info)
+    {
+        $order_sn = $refill_info['order_sn'];
+        $order_id = $refill_info['order_id'];
+
+        $params = $this->query_params($order_sn);
+        $sign = $this->sign($params);
+        $params['signature'] = $sign;
+
+        $uri = config::ORDER_URL . "/fuelRecharge/order/detail";
+        $resp = http_post_data($uri,json_encode($params), config::ExtHeaders);
+        Log::record("query resp={$resp}",Log::DEBUG);
+
+        if(empty($resp)) {
+            return [false,'网络错误'];
+        }
+
+        Log::record($resp,Log::DEBUG);
+        $resp = json_decode($resp,true);
+
+        if(empty($resp)) {
+            return [false,'网络错误'];
+        }
+        elseif($resp['code'] == 0)
+        {
+            $data = $resp['data'];
+            $status = intval($data['orderStatus']);
+
+            if ($status === 101) {
+                $updata['official_sn'] = $data['voucher'];
+                $updata['ch_trade_no'] = $data['orderNumber'];
+                $updata['err_msg'] = $resp['message'];
+                Model('refill_order')->edit($order_id, $updata);
+
+                return [true, ORDER_STATE_SUCCESS];
+            }
+            elseif ($status === 102) {
+                $updata['official_sn'] = $data['voucher'];
+                $updata['ch_trade_no'] = $data['orderNumber'];
+                $updata['err_msg'] = $resp['message'];
+
+                Model('refill_order')->edit($order_id, $updata);
+                $this->onError($resp['message'],$order_id);
+
+                return [true, ORDER_STATE_CANCEL];
+            }
+            elseif($status === 100 || $status === 106) {
+                return [true, ORDER_STATE_SEND];
+            }
+            else {
+                return [false, $resp['message']];
+            }
+        }
+        else {
+            return [false,$resp['message']];
+        }
+    }
+
+    public function onError($msg,$order_id)
+    {
+        if(in_array($msg,config::BlackMsgs))
+        {
+            $refill = Model('refill_order');
+            $order = $refill->getOrderInfo(['order_id' => $order_id]);
+            if(empty($order)) return false;
+
+            $card_no = $order['card_no'];
+            if(!empty($card_no)) {
+                refill\util::set_black($card_no);
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    public function balance()
+    {
+        return [false, '暂无余额接口'];
+    }
+}

+ 24 - 0
helper/refill/api/test/gftd/RefillPhone.php

@@ -0,0 +1,24 @@
+<?php
+namespace refill\gftd;
+
+require_once(BASE_HELPER_RAPI_PATH . '/gftd/config.php');
+
+use refill;
+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'];
+    }
+}

+ 18 - 0
helper/refill/api/test/gftd/config.php

@@ -0,0 +1,18 @@
+<?php
+
+
+namespace refill\gftd;
+
+
+class config
+{
+//    const ORDER_URL = 'https://dev.oapi.chinasaltenergy.com/open-api'; #dev
+    const ORDER_URL = 'https://oapi.chinasaltenergy.com/open-api';   #prod
+
+    const APP_ID= 'CAE45C97727DECDF';
+    const APP_SECRET = '4023D6F779324C21BF8D8FC10A21CFD4';
+
+    const NOTIFY_URL =  BASE_SITE_URL."/mobile/refill_gftd.php";
+    const ExtHeaders = ['Content-Type: application/json;charset=UTF-8;','Accept:application/json;charset=UTF-8;'];
+    const BlackMsgs = ["只能给主卡且卡状态正常的加油卡充值","加油卡卡号错误或不支持"];
+}

+ 113 - 0
helper/refill/api/test/gftdsinop/RefillCallBack.php

@@ -0,0 +1,113 @@
+<?php
+
+
+namespace refill\gftdsinop;
+
+require_once(BASE_HELPER_RAPI_PATH . '/gftdsinop/config.php');
+
+
+use refill;
+
+class RefillCallBack implements refill\IRefillCallBack
+{
+    public function verify($params): bool
+    {
+        $input = $params;
+        unset($input['signature']);
+
+        $sign = $this->sign($input);
+        if ($params['signature'] == $sign) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private function sign($params)
+    {
+        $body = $this->body($params);
+        $body .= config::APP_SECRET;
+
+        return md5($body);
+    }
+
+    protected function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+
+    private function body($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}" . "=" . $v;
+                } else {
+                    $body .= "&" . "{$k}" . "=" . $v;
+                }
+                $i++;
+            }
+        }
+        return $body;
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['status']);
+
+        $order_sn = $params['channelOrderNumber'];
+        $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['voucher'];
+        $data['ch_trade_no'] = $params['orderNumber'];
+        $data['err_msg'] = $params['message'];
+
+        Model('refill_order')->edit($order_id, $data);
+
+        //[$order_id, 成功失败, 是否能重试,接下来是否需要处理]
+        if ($status === 101) {
+            return [$order_id, true, false, true];
+        } elseif ($status === 109) {
+            $this->onError($params['message'], $order_id);
+            return [$order_id, false, true, true];
+        } elseif ($status === 120) {
+            return [$order_id, false, false, false];
+        } else {
+            return [$order_id, false, false, false];
+        }
+    }
+
+    public function onError($msg,$order_id)
+    {
+        if(in_array($msg,config::BlackMsgs))
+        {
+            $refill = Model('refill_order');
+            $order = $refill->getOrderInfo(['order_id' => $order_id]);
+
+            if(empty($order)) return false;
+
+            $card_no = $order['card_no'];
+            if(!empty($card_no)) {
+                refill\util::set_black($card_no);
+                return true;
+            }
+        }
+
+        return false;
+    }
+}

+ 226 - 0
helper/refill/api/test/gftdsinop/RefillOil.php

@@ -0,0 +1,226 @@
+<?php
+
+
+namespace refill\gftdsinop;
+
+require_once(BASE_HELPER_RAPI_PATH . '/gftdsinop/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['appid'] = config::APP_ID;
+        $params['ts'] = time();
+
+        $params['productId'] = $this->product_id($amount,$card_type);
+        $params['outOrderNumber'] = $other['order_sn'];
+        $params['fuelCardNumber'] = $card_no;
+
+        $params['fuelCardUserName'] = "";
+        $params['fuelCardUserID'] = "";
+
+        $card_info = refill\util::read_card($card_no,$card_type);
+
+        $params['telephone'] = $card_info['bind_phone'];
+        $params['phoneNumber'] = $card_info['bind_phone'];
+
+        return [$params, $card_info];
+    }
+
+    private function product_id(int $amount,int $cart_type)
+    {
+        if($cart_type === mtopcard\PetroChinaCard)
+        {
+            switch ($amount) {
+                case 100: return 1;
+                case 200: return 2;
+                case 500: return 3;
+                case 1000: return 4;
+            }
+        }
+        else
+        {
+            switch ($amount) {
+                case 100: return 5;
+                case 200: return 6;
+                case 500: return 7;
+                case 1000: return 8;
+            }
+        }
+
+        return false;
+    }
+
+    private function sign($params)
+    {
+        $body = $this->body($params);
+        $body .= config::APP_SECRET;
+
+        return md5($body);
+    }
+
+    protected function check_empty($value)
+    {
+        if (!isset($value))
+            return true;
+        if ($value === null)
+            return true;
+        if (trim($value) === "")
+            return true;
+
+        return false;
+    }
+
+    private function body($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}" . "=" . $v;
+                } else {
+                    $body .= "&" . "{$k}" . "=" . $v;
+                }
+
+                $i++;
+            }
+        }
+        return $body;
+    }
+
+    public function add($card_no,$card_type,$amount,$input,&$net_errno = 0)
+    {
+        [$params,$card_info] = $this->req_params($card_no,$card_type,$amount,$input);
+
+        $sign = $this->sign($params);
+        $params['signature'] = $sign;
+
+        $uri = config::ORDER_URL . "/fuelRecharge/create";
+        $resp = http_post_data($uri,json_encode($params), 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'] == 0)
+            {
+                refill\util::inc_card($card_no,$card_info);
+                $data = $resp['data'];
+                return [true,$data['orderNumber'], false];
+            }
+            else {
+                return [false,$resp['message'], false];
+            }
+        }
+    }
+
+    private function query_params($order_sn)
+    {
+        $params['appid'] = config::APP_ID;
+        $params['ts'] = time();
+        $params['outOrderNumber'] = $order_sn;
+
+        return $params;
+    }
+
+    public function query($refill_info)
+    {
+        $order_sn = $refill_info['order_sn'];
+        $order_id = $refill_info['order_id'];
+
+        $params = $this->query_params($order_sn);
+        $sign = $this->sign($params);
+        $params['signature'] = $sign;
+
+        $uri = config::ORDER_URL . "/fuelRecharge/order/detail";
+        $resp = http_post_data($uri,json_encode($params), config::ExtHeaders);
+        Log::record("query resp={$resp}",Log::DEBUG);
+
+        if(empty($resp)) {
+            return [false,'网络错误'];
+        }
+
+        Log::record($resp,Log::DEBUG);
+        $resp = json_decode($resp,true);
+
+        if(empty($resp)) {
+            return [false,'网络错误'];
+        }
+        elseif($resp['code'] == 0)
+        {
+            $data = $resp['data'];
+            $status = intval($data['orderStatus']);
+
+            if ($status === 101) {
+                $updata['official_sn'] = $data['voucher'];
+                $updata['ch_trade_no'] = $data['orderNumber'];
+                $updata['err_msg'] = $resp['message'];
+                Model('refill_order')->edit($order_id, $updata);
+
+                return [true, ORDER_STATE_SUCCESS];
+            }
+            elseif ($status === 102) {
+                $updata['official_sn'] = $data['voucher'];
+                $updata['ch_trade_no'] = $data['orderNumber'];
+                $updata['err_msg'] = $resp['message'];
+
+                Model('refill_order')->edit($order_id, $updata);
+                $this->onError($resp['message'],$order_id);
+
+                return [true, ORDER_STATE_CANCEL];
+            }
+            elseif($status === 100 || $status === 106) {
+                return [true, ORDER_STATE_SEND];
+            }
+            else {
+                return [false, $resp['message']];
+            }
+        }
+        else {
+            return [false,$resp['message']];
+        }
+    }
+
+    public function onError($msg,$order_id)
+    {
+        if(in_array($msg,config::BlackMsgs))
+        {
+            $refill = Model('refill_order');
+            $order = $refill->getOrderInfo(['order_id' => $order_id]);
+            if(empty($order)) return false;
+
+            $card_no = $order['card_no'];
+            if(!empty($card_no)) {
+                refill\util::set_black($card_no);
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    public function balance()
+    {
+        return [false, '暂无余额接口'];
+    }
+}

+ 24 - 0
helper/refill/api/test/gftdsinop/RefillPhone.php

@@ -0,0 +1,24 @@
+<?php
+namespace refill\gftd;
+
+require_once(BASE_HELPER_RAPI_PATH . '/gftdsinop/config.php');
+
+use refill;
+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'];
+    }
+}

+ 18 - 0
helper/refill/api/test/gftdsinop/config.php

@@ -0,0 +1,18 @@
+<?php
+
+
+namespace refill\gftdsinop;
+
+
+class config
+{
+//    const ORDER_URL = 'https://dev.oapi.chinasaltenergy.com/open-api'; #dev
+    const ORDER_URL = 'https://oapi.chinasaltenergy.com/open-api';   #prod
+
+    const APP_ID= 'CAE45C97727DECDF';
+    const APP_SECRET = '4023D6F779324C21BF8D8FC10A21CFD4';
+
+    const NOTIFY_URL =  BASE_SITE_URL."/mobile/refill_gftd.php";
+    const ExtHeaders = ['Content-Type: application/json;charset=UTF-8;','Accept:application/json;charset=UTF-8;'];
+    const BlackMsgs = ["只能给主卡且卡状态正常的加油卡充值","加油卡卡号错误或不支持"];
+}

+ 50 - 0
helper/refill/api/test/guochuang/RefillCallBack.php

@@ -0,0 +1,50 @@
+<?php
+
+
+namespace refill\guochuang;
+
+require_once(BASE_HELPER_RAPI_PATH . '/guochuang/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)
+    {
+        $key = config::ApiKey;
+        $content = "{$params['body']}&ts={$params['ts']}&key={$key}";
+        return strtoupper(md5($content));
+    }
+
+    public function notify($params)
+    {
+        $params = json_decode($params['body'], true);
+        $status = $params['status'];
+        $order_sn = $params['outerId'];
+        $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') {
+            $data['official_sn'] = strtolower($params['evidence']) == 'null' ? '' : $params['evidence'];
+            Model('refill_order')->edit($order_id, $data);
+            return [$order_id, true, false, true];
+        } elseif ($status === 'FAIL') {
+            return [$order_id, false, true, true];
+        } else {
+            return [$order_id, false, false, false];
+        }
+    }
+}

+ 197 - 0
helper/refill/api/test/guochuang/RefillPhone.php

@@ -0,0 +1,197 @@
+<?php
+
+namespace refill\guochuang;
+
+require_once(BASE_HELPER_RAPI_PATH . '/guochuang/config.php');
+
+use refill;
+use Log;
+
+class RefillPhone extends refill\IRefillPhone
+{
+    public function __construct($cfgs)
+    {
+        parent::__construct($cfgs);
+    }
+
+    public function goods($quality,int $amount,int $card_type,$regin_no,$other)
+    {
+        [$goods_id, $price] = parent::goods($quality,$amount,$card_type,$regin_no,$other);
+        if($goods_id <= 0) return [0,0];
+        $key = "{$card_type}-{$amount}-{$regin_no}";
+        $price = config::Price[$key];
+        if(empty($price)) {
+            Log::record("channel cannot find price where name={$this->mName}, goods_id = {$goods_id} card_type={$card_type} amount={$amount} regin_no={$regin_no}",Log::ERR);
+            return [0,0];
+        } else {
+            return [$goods_id,ncPriceFormat($price)];
+        }
+    }
+
+    private function req_params(int $phone, int $amount, int $card_type, string $order_sn)
+    {
+        $params['phone'] = $phone;
+        $params['phoneType'] = config::operator[$card_type];
+        $params['money'] = $amount;
+        $params['outerId'] = $order_sn;
+        $params['callBackUrl'] = config::NOTIFY_URL;
+        $params['speed'] = 0;
+
+        return $params;
+    }
+
+    //统一请求
+    private function url_request($params,$service)
+    {
+        $get_params['service'] = $service;
+        $get_params['userId'] = config::UserId;
+        $get_params['ts'] = $this->getMillisecond();
+
+        $sign = $this->sign($params,$get_params);
+        $get_params['sign'] = $sign;
+
+        $url = config::API_URL;
+        $url = $url . (strpos($url, '?') ? '&' : '?') . (is_array($get_params) ? http_build_query($get_params) : $get_params);
+        return http_request($url, $params, 'POST', false, [], $net_errno);
+    }
+
+    public function add($card_no, $card_type, $amount, $params,&$net_errno = 0)
+    {
+        $order_sn = $params['order_sn'];
+        $regin_no = $params['regin_no'] ?? -1;
+
+        if($regin_no <= 0) {
+            return [false, '省份获取错误', false];
+        }
+
+        $params = $this->req_params($card_no, $amount, $card_type, $order_sn);
+        $params['provId'] = config::ProvinceMap[$regin_no];
+        if(empty($params['provId'])) {
+            return [false, '省份获取错误', false];
+        }
+
+        $resp = $this->url_request($params,'order.phone.charge');
+        if (empty($resp)) {
+            return [false, '系统错误', true];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+
+            $resp = json_decode($resp ,true);
+            $code = $resp['code'];
+            if (empty($resp)) {
+                return [false, '系统错误', true];
+            } elseif ($code == 'SUCCESS') {
+                return [true, $resp['id'], false];
+            } elseif (in_array($code, config::ORDER_ERR_CODE)) {
+                return [false, $code, false];
+            } elseif (in_array($code, ['SYSTEM_ERROR', 'ORDER_ID_EXIST'])) {
+                $net_errno = "HTTP-{$code}";
+                return [false, $code, false];
+            } else {
+                $err = 998;
+                $net_errno = "HTTP-{$err}";
+                return [false, $code, false];
+            }
+        }
+    }
+
+    public function query($refill_info)
+    {
+        //上游单号,可以为空,但需参与签名
+        $params['id'] = '';
+        $params['outerId'] = $refill_info['order_sn'];
+
+        $resp = $this->url_request($params,'order.status.query');
+
+        if (empty($resp)) {
+            return [false, '系统错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            $code = $resp['code'];
+            if (empty($resp))
+            {
+                return [false, '系统错误'];
+            }
+            elseif ($code == 'SUCCESS')
+            {
+                $status = $resp['status'];
+
+                if ($status === 'SUCCESS') {
+                    $order_state = ORDER_STATE_SUCCESS;
+                    $save['official_sn'] = strtolower($resp['evidence']) == 'null' ? '' : $resp['evidence'];
+                    Model('refill_order')->edit($refill_info['order_id'], $save);
+                } elseif ($status === 'FAIL') {
+                    $order_state = ORDER_STATE_CANCEL;
+                } elseif ($status === 'PROCESSING') {
+                    $order_state = ORDER_STATE_SEND;
+                } elseif ($status === 'ORDER_NOT_EXIST' && (time() - $refill_info['commit_time'] >= 600)) {
+                    $order_state = ORDER_STATE_NOEXIST;
+                } else {
+                    return [false, $code];
+                }
+
+                return [true, $order_state];
+            }
+            else
+            {
+                return [false, "code={$code}"];
+            }
+        }
+    }
+
+    public function balance()
+    {
+        $resp = $this->url_request([],'user.balance.query');
+
+        if (empty($resp)) {
+            return [false, '系统错误'];
+        }
+        else
+        {
+            Log::record($resp, Log::DEBUG);
+            $resp = json_decode($resp, true);
+            if (empty($resp))
+            {
+                return [false, '系统错误'];
+            }
+            elseif ($resp['code'] == 'SUCCESS')
+            {
+                return [true, $resp['balance']];
+            }
+            else
+            {
+                return [false, $resp['code']];
+            }
+        }
+    }
+
+    private function sign($params,$get_params)
+    {
+        $userId = config::UserId;
+        $api_key = config::ApiKey;
+        $content = "service={$get_params['service']}&userId={$userId}&ts={$get_params['ts']}&";
+        if(!empty($params)) {
+            foreach ($params as $key => $value){
+                $content .= "{$key}={$value}&";
+            }
+            $content = rtrim($content, '&');
+        }
+        $content .= "&key={$api_key}";
+        return strtoupper(md5($content));
+    }
+
+    /**
+     * 获取毫秒级别的时间戳
+     */
+    private function getMillisecond()
+    {
+        $cur = microtime (true);
+        $cur = intval($cur * 1000);
+        return $cur;
+    }
+}

+ 92 - 0
helper/refill/api/test/guochuang/config.php

@@ -0,0 +1,92 @@
+<?php
+
+
+namespace refill\guochuang;
+
+use mtopcard;
+
+class config
+{
+    const API_URL = 'http://39.98.30.44:34341/hbgc/zz003';
+
+    const UserId = 'bjgy8888';
+    const ApiKey = 'dlNEZFRZbFVCbVVo';
+    const NOTIFY_URL = BASE_SITE_URL . "/mobile/callback/refill_guochuang.php";
+    const operator = [
+        mtopcard\ChinaMobileCard => 11,
+        mtopcard\ChinaUnicomCard => 21,
+        mtopcard\ChinaTelecomCard => 31
+    ];
+    //key值为regin_no,value为上游省份id
+
+    //系统省份变化 -> 国创省份编号 转换表
+    const ProvinceMap = [
+        1	=> 1,  //'北京',
+        2	=> 2,  //'天津',
+        3	=> 10, //'河北',
+        4	=> 12, //'山西',
+        5	=> 5,  //'内蒙古',
+        6	=> 8,  //'辽宁',
+        7	=> 7,  //'吉林',
+        8	=> 6,  //'黑龙江',
+        9	=> 3,  //'上海',
+        10	=> 20, //'江苏',
+        11	=> 21, //'浙江',
+        12	=> 18, //'安徽',
+        13	=> 22, //'福建',
+        14	=> 19, //'江西',
+        15	=> 11, //'山东',
+        16	=> 9,  //'河南',
+        17	=> 14, //'湖北',
+        18	=> 13, //'湖南',
+        19	=> 15, //'广东',
+        20	=> 16, //'广西',
+        21	=> 17, //'海南',
+        22	=> 4,  //'重庆',
+        23	=> 28, //'四川',
+        24	=> 27, //'贵州',
+        25	=> 26, //'云南',
+        26	=> 31, //'西藏',
+        27	=> 23, //'陕西',
+        28	=> 24, //'甘肃',
+        29	=> 29, //'青海',
+        30	=> 25, //'宁夏',
+        31	=> 30  //'新疆'
+    ];
+
+    const ORDER_ERR_CODE = [
+        'PARAM_EMPTY', 'PARAM_ERROR', 'PARAM_TS_TIMEOUT', 'USER_NOT_EXISTS', 'USER_AUTH_NOT_ENOUGH',
+        'IP_DENY', 'SIGN_ERROR', 'SYSTEM_ERROR_DB', 'BALANCE_NOT_ENOUGH',
+        'ORDER_PRICE_ERROR', 'ORDER_NOT_SUPPORT_ACCOUNT', 'ORDER_NOT_SUPPORT_CHANNEL', 'DENY_ACCOUNT'
+    ];
+
+    //key格式 卡类型-面值-regin_no
+    const Price = [
+        //移动
+        "4-10-2" => 9.94, "4-20-2" => 19.88, "4-30-2" => 29.82, "4-50-2" => 49.7, "4-100-2" => 99.4, "4-200-2" => 198.8, "4-300-2" => 298.2, "4-500-2" => 497,//天津 2
+        "4-10-6" => 9.71, "4-20-6" => 19.42, "4-30-6" => 29.13, "4-50-6" => 48.55, "4-100-6" => 97.1, "4-200-6" => 194.2, "4-300-6" => 291.3, "4-500-6" => 485.5,//辽宁 6
+        "4-10-9" => 9.9, "4-20-9" => 19.8, "4-30-9" => 29.7, "4-50-9" => 49.5, "4-100-9" => 99,//上海 9
+        "4-10-8" => 9.95, "4-20-8" => 19.9, "4-30-8" => 29.85, "4-50-8" => 49.75, "4-100-8" => 99.5, "4-200-8" => 199, "4-300-8" => 298.5, "4-500-8" => 497.5,//黑龙江 8
+        "4-10-29" => 9.82, "4-20-29" => 19.64, "4-30-29" => 29.46, "4-50-29" => 49.1, "4-100-29" => 98.2, "4-200-29" => 196.4, "4-300-29" => 294.6, "4-500-29" => 491,//青海 29
+        "4-10-28" => 9.92, "4-20-28" => 19.84, "4-30-28" => 29.76, "4-50-28" => 49.6, "4-100-28" => 99.2, "4-200-28" => 198.4, "4-300-28" => 297.6, "4-500-28" => 496,//甘肃 28
+        "4-10-13" => 10.02, "4-20-13" => 20.04, "4-30-13" => 30.06, "4-50-13" => 50.1, "4-100-13" => 100.2, "4-200-13" => 200.4, "4-300-13" => 300.6, "4-500-13" => 501,//福建 13
+        "4-10-5" => 9.97, "4-20-5" => 19.94, "4-30-5" => 29.91, "4-50-5" => 49.85, "4-100-5" => 99.7, "4-200-5" => 199.4, "4-300-5" => 299.1, "4-500-5" => 498.5,//内蒙古 5
+        "4-50-18" => 49.55, "4-100-18" => 99.1, "4-200-18" => 198.2,//湖南 18
+        "4-10-19" => 9.95, "4-20-19" => 19.9, "4-30-19" => 29.85, "4-50-19" => 49.75, "4-100-19" => 99.5, "4-200-19" => 199, "4-300-19" => 298.5, "4-500-19" => 497.5,//广东 19
+        "4-10-7" => 9.9, "4-20-7" => 19.8, "4-30-7" => 29.7, "4-50-7" => 49.5, "4-100-7" => 99, "4-200-7" => 198, "4-300-7" => 297, "4-500-7" => 495,//吉林 7
+        "4-10-1" => 9.99, "4-20-1" => 19.98, "4-30-1" => 29.97, "4-50-1" => 49.95, "4-100-1" => 99.9, "4-200-1" => 199.8, "4-300-1" => 299.7, "4-500-1" => 499.5,//北京 1
+        "4-20-22" => 20, "4-30-22" => 30, "4-50-22" => 50, "4-100-22" => 100, "4-200-22" => 200, "4-300-22" => 300, "4-500-22" => 500,//重庆 22
+        "4-10-15" => 9.96, "4-20-15" => 19.92, "4-30-15" => 29.88, "4-50-15" => 49.8, "4-100-15" => 99.6, "4-200-15" => 199.2, "4-300-15" => 298.8, "4-500-15" => 498,//山东 15
+        "4-10-10" => 9.96, "4-20-10" => 19.92, "4-30-10" => 29.88, "4-50-10" => 49.8, "4-100-10" => 99.6, "4-200-10" => 199.2, "4-300-10" => 298.8, "4-500-10" => 498,//江苏 10
+        "4-10-11" => 9.96, "4-20-11" => 19.92, "4-30-11" => 29.88, "4-50-11" => 49.8, "4-100-11" => 99.6, "4-200-11" => 199.2, "4-300-11" => 298.8, "4-500-11" => 498,//浙江 11
+        "4-10-17" => 9.96, "4-20-17" => 19.92, "4-30-17" => 29.88, "4-50-17" => 49.8, "4-100-17" => 99.6, "4-200-17" => 199.2, "4-300-17" => 298.8, "4-500-17" => 498,//湖北 17
+        "4-30-16" => 29.82, "4-50-16" => 49.7, "4-100-16" => 99.4, "4-200-16" => 198.8,//河南 16
+        //联通
+        "5-10-19" => 10.01, "5-20-19" => 20.02, "5-30-19" => 30.03, "5-50-19" => 50.05, "5-100-19" => 100.1, "5-200-19" => 200.2, "5-300-19" => 300.3, "5-500-19" => 500.5,//广东 19
+        "5-10-1" => 9.99, "5-20-1" => 19.98, "5-30-1" => 29.97, "5-50-1" => 49.95, "5-100-1" => 99.9, "5-200-1" => 199.8, "5-300-1" => 299.7, "5-500-1" => 499.5,//北京 1
+        "5-20-22" => 20, "5-30-22" => 30, "5-50-22" => 50, "5-100-22" => 100, "5-200-22" => 200, "5-300-22" => 300, "5-500-22" => 500,//重庆 22
+        //电信
+        "6-10-27" => 9.92, "6-20-27" => 19.84, "6-30-27" => 29.76, "6-50-27" => 49.6, "6-100-27" => 99.2, "6-200-27" => 198.4, "6-300-27" => 297.6, "6-500-27" => 496,//陕西 27
+        "6-10-4" => 9.93, "6-20-4" => 19.86, "6-30-4" => 29.79, "6-50-4" => 49.65, "6-100-4" => 99.3, "6-200-4" => 198.6, "6-300-4" => 297.9, "6-500-4" => 496.5,//山西 4
+    ];
+}

二進制
helper/refill/api/test/guochuang/北京国研三网分省调价函.xls


+ 13 - 0
helper/refill/api/test/guochuang/国创新提交地址.txt

@@ -0,0 +1,13 @@
+提交地址;http://39.98.30.44:34341/hbgc/zz003
+查单地址;http://39.98.30.44:34341/hbgc/zz003
+余额地址;http://39.98.30.44:34341/hbgc/zz003
+
+
+
+最新客户端后台:http://39.98.190.175:13131 (初始密码123456谷歌浏览器登陆)
+
+账户ID:bjgy8888
+全称:北京国研方略信息科学研究院
+简称:北京国研
+电话:18500608333
+密钥:dlNEZFRZbFVCbVVo

二進制
helper/refill/api/test/guochuang/接口使用说明V2.0.20200427.pdf


二進制
helper/refill/api/test/guochuang/接口签名补充说明.docx


+ 51 - 0
helper/refill/api/test/hongxudagy/RefillCallBack.php

@@ -0,0 +1,51 @@
+<?php
+namespace refill\hongxudagy;
+
+require_once(BASE_HELPER_RAPI_PATH . '/hongxudagy/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::MER_ID;
+        $key = config::KEY;
+        $content = "{$params['supply_id']}{$params['order_status']}{$userid}{$params['product_no']}{$params['mer_oid']}{$params['phone_no']}{$params['product_face']}";
+        $content .= $key;
+        return strtoupper(md5($content));
+    }
+
+    public function notify($params)
+    {
+        $status = intval($params['order_status']);
+        $order_sn = $params['mer_oid'];
+        $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 === 0) {
+            $data['official_sn'] = strtolower($params['cp_id']) == 'null' ? '' : $params['cp_id'];
+            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];
+        }
+    }
+}

+ 0 - 0
helper/refill/api/test/hongxudagy/RefillPhone.php


Some files were not shown because too many files changed in this diff