HaikeApiRequest.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698
  1. <?php
  2. declare (strict_types=1);
  3. namespace app\traits;
  4. use think\facade\Log;
  5. /**
  6. * 海科商户入驻统一请求API
  7. * Trait HaikeApiRequest
  8. * @package app\traits
  9. */
  10. trait HaikeApiRequest
  11. {
  12. /**
  13. * 统一请求
  14. * @return bool|string
  15. * @author php迷途小书童
  16. * @created 2021/1/26 15:49
  17. */
  18. public static function request($data,$url){
  19. try {
  20. $data['accessid'] = env('HAIKE.ACCESSID');
  21. $accesskey = env('HAIKE.ACCESS_KEY');
  22. $sign = self::getSignContent($data,$accesskey);
  23. $data["sign"] = strtoupper($sign);
  24. return self::posturl($url,$data);
  25. } catch (\Throwable $e) {
  26. return $e->getMessage();
  27. }
  28. }
  29. /**
  30. * 申请商户
  31. * @return bool|string
  32. * @author php迷途小书童
  33. * @created 2021/1/20 15:49
  34. */
  35. public function merchantApply($merchant = []){
  36. $merchantData = [];
  37. switch ($merchant['type']) {
  38. case 2:
  39. $merch_type = "10A";
  40. $imageType = [
  41. "A1" => $merchant['credit_img'],//营业执照图片id
  42. ];
  43. $merchantData = [
  44. "bus_license_no"=> $merchant['credit_code'],//营业执照号
  45. ];
  46. break;
  47. case 1:
  48. $merch_type = "10B";
  49. $imageType = [
  50. "A1" => $merchant['credit_img'],//营业执照图片id
  51. ];
  52. $merchantData = [
  53. "bus_license_no"=> $merchant['credit_code'],//营业执照号
  54. ];
  55. break;
  56. case 3:
  57. $imageType = [
  58. "A7" => "57b9a9aca2bb41a7b35ea882945d230c",//合作协议(首页)图片id
  59. "A9" => $merchant['business_premises4'],//合作协议(盖章页)图片id
  60. ];
  61. $merch_type = "10C";
  62. break;
  63. }
  64. try {
  65. $data = [
  66. "agent_no" => env('HAIKE.AGENT_NO'),//服务商编号
  67. "agent_apply_no"=> $merchant['agent_apply_no'],//服务商申请单号
  68. "notify_url"=> env('APP_URL')."/api/merchant/apply_notice",//商户审核状态变更后的通知地址
  69. "merchant_data"=> $merchantData + [
  70. "legal_cert_type"=> "1",//法人证件类型
  71. "contact_phone" => $merchant['phone'],//联系人手机号
  72. "merch_type"=> $merch_type,//商户类型10A:个体工商户10B:企业10C:小微商户
  73. "shop_name"=> $merchant['mer_name'],//门店名称
  74. "contact_email"=> $merchant['email'],//联系人邮箱
  75. "merch_name"=> $merchant['mer_name'],//商户全称
  76. "ledger_receive_flag"=> $merchant["haike_receive_flag"],//参与分账业务的收账方标识0:否,1:是。如为空,则默认为:0(v1.18),即为分账方
  77. "contact_name"=> $merchant['name'],//联系人姓名
  78. "legal_cert_no"=> $merchant['legal_cert_no'],//法人证件号
  79. "bus_address"=> $merchant['business_addr'],//营业执照经营地址:详细地址
  80. "merch_short_name"=> $merchant['mer_short_name'],//商户简称
  81. "legal_name"=> $merchant['name'],//法人姓名
  82. "address"=> $merchant['addr'],//实际经营地址:详细地址
  83. "area_code"=> $merchant['area_code'],//实际经营地址:区代码
  84. "city_code"=> $merchant['city_code'],//实际经营地址:市代码
  85. "province_code"=> $merchant['province_code'],//实际经营地址:省代码
  86. "bus_area_code"=> $merchant['area_code'],//营业执照经营地址:区代码
  87. "bus_city_code"=> $merchant['city_code'],//营业执照经营地址:市代码
  88. "bus_province_code"=> $merchant['province_code'],//营业执照经营地址:省代码
  89. "bus_scope_code"=> "00010007"//营业范围代码
  90. ],
  91. "bankcard_data"=> [
  92. "acc_name"=> $merchant['acc_type'] == "10A" ? $merchant['mer_name'] : $merchant['name'],//结算账户名称
  93. "bank_code"=> $merchant['bank_code'],//结算账户清算行号
  94. "acc_type"=> $merchant['acc_type'],//结算类型10A:对公10B:对私
  95. "phone"=> $merchant['phone'],//预留手机号
  96. "acc_no"=> $merchant['bank_account'],//结算账户号
  97. "bank_name"=> $merchant['bank_branch'],//结算卡开户银行网点名称
  98. "idcard_no"=> $merchant['idcard_no'],//持卡人身份证号
  99. "bank_city_code"=> $merchant['bank_city_code'],//开户行网点 对应的市代码
  100. "bank_province_code"=> $merchant['bank_province_code'],//开户行网点 对应的省代码
  101. ],
  102. "image_data"=> $imageType + [
  103. "A2"=> $merchant['card_positive_person'],//法人身份证正面图片id
  104. "A3"=> $merchant['card_back_person'],//法人身份证反面图片id
  105. "A4"=> $merchant['card_positive_bank'],//结算卡正面/开户许可证(基本户)图片id
  106. "A5"=> $merchant['business_premises1'],//商户门头照图片id
  107. "A6"=> $merchant['business_premises2'],//营业场所室内照图片id
  108. "A31"=> $merchant['business_premises3'],//营业场所室内照2图片id
  109. ],
  110. ];
  111. switch ($merchant['is_again']) {
  112. case 0:
  113. $url = env('HAIKE.HOSTNAME')."/api/v1/merchant/apply";
  114. break;
  115. case 1:
  116. $url = env('HAIKE.HOSTNAME').'/api/v1/merchant/modify';
  117. $data['merch_no'] = $merchant['merch_no'];
  118. break;
  119. case 2:
  120. $url = env('HAIKE.HOSTNAME').'/api/v1/merchant-modify/apply';
  121. $data['merch_no'] = $merchant['merch_no'];
  122. // unset($data['image_data']);
  123. break;
  124. default:
  125. $url = '';
  126. break;
  127. }
  128. return self::request($data,$url);
  129. } catch (\Throwable $e) {
  130. Log::info($e->getMessage());
  131. return false;
  132. }
  133. }
  134. /**
  135. * 申请商户
  136. * @return bool|string
  137. * @author php迷途小书童
  138. * @created 2021/1/20 15:49
  139. */
  140. public function merchantModify($merchant = []){
  141. try {
  142. $data = [
  143. "agent_no" => env('HAIKE.AGENT_NO'),//服务商编号
  144. "agent_apply_no"=> $merchant['agent_apply_no'],//服务商申请单号
  145. "notify_url"=> env('APP_URL')."/api/merchant/apply_notice",//商户审核状态变更后的通知地址
  146. "merchant_data"=> [
  147. "merch_name"=> $merchant['mer_name'],//商户全称
  148. "merch_short_name"=> $merchant['mer_short_name'],//商户简称
  149. ],
  150. ];
  151. $url = env('HAIKE.HOSTNAME').'/api/v1/merchant-modify/apply';
  152. $data['merch_no'] = $merchant['merch_no'];
  153. return self::request($data,$url);
  154. } catch (\Throwable $e) {
  155. Log::info($e->getMessage());
  156. return false;
  157. }
  158. }
  159. /**
  160. * 微信二次认证
  161. * @return bool|string
  162. * @author php迷途小书童
  163. * @created 2021/1/28 17:33
  164. */
  165. public function wxAuthApply($merchant = [])
  166. {
  167. //SUBJECT_TYPE_ENTERPRISE:企业
  168. //SUBJECT_TYPE_INDIVIDUAL:个体工商户
  169. //SUBJECT_TYPE_MICRO:小微商户
  170. switch ($merchant['type']) {
  171. case 1:
  172. case 2:
  173. if ($merchant['type'] == 1) {
  174. $subject_type = "SUBJECT_TYPE_ENTERPRISE";
  175. } else {
  176. $subject_type = "SUBJECT_TYPE_INDIVIDUAL";
  177. }
  178. //主体信息
  179. $subject_info = [
  180. "subject_type" => $subject_type,
  181. "business_licence_info" => [//营业执照信息
  182. "licence_number" => $merchant['credit_code'],//营业执照注册号
  183. "licence_copy" => $merchant['credit_img'],//营业执照照片
  184. "merchant_name" => $merchant['mer_name'],//商户名称
  185. "legal_person" => $merchant['name'],//法人姓名
  186. "company_address" => $merchant['business_addr'],//注册地址
  187. "licence_valid_date" => ["1970-01-01","forever"]//营业执照有效日期
  188. ]
  189. ];
  190. break;
  191. case 3:
  192. //主体信息
  193. $subject_info = [
  194. "subject_type" => "SUBJECT_TYPE_MICRO",
  195. "assist_prove_info" => [
  196. "micro_biz_type" => "MICRO_TYPE_STORE",//营业执照有效日期
  197. "store_name" => $merchant['mer_name'],//门店名称
  198. "store_address_code" => $merchant['area_code'],//门店省市编码
  199. "store_address" => $merchant['addr'],//门店地址
  200. "store_header_copy" => $merchant['business_premises1'],//门店门头照片
  201. "store_indoor_copy" => $merchant['business_premises2'],//店内环境照片
  202. ]
  203. ];
  204. break;
  205. }
  206. $data = [
  207. "agent_no" => env('HAIKE.AGENT_NO'),//服务商编号
  208. "merch_no" => $merchant['merch_no'],//海科商户编号
  209. "wx_merch_no" => $merchant['wx_merch_no'],//微信商户编号
  210. "business_code" => $merchant['agent_apply_no'],//业务申请编号
  211. "contact_info" => [//联系人信息
  212. "name" => $merchant['name'],//联系人姓名
  213. "mobile" => $merchant['phone'],//联系人手机号
  214. "id_card_number" => $merchant['idcard_no'],//联系人身份证号码
  215. ],
  216. "subject_info" => $subject_info,
  217. "identification_info" => [
  218. "identification_type" => "IDENTIFICATION_TYPE_IDCARD",//法人证件类型
  219. "identification_name" => $merchant['name'],//证件姓名
  220. "identification_number" => $merchant['idcard_no'],//证件号码
  221. "identification_valid_date" => [$merchant['identification_valid_date_start'], $merchant['identification_valid_date_end']],//证件有效日期
  222. "identification_front_copy" => $merchant['card_positive_person'],//证件正面照片
  223. "identification_back_copy" => $merchant['card_back_person'],//证件反面照片
  224. ]
  225. ];
  226. $url = env('HAIKE.HOSTNAME')."/api/v1/wx-auth/apply";
  227. return self::request($data,$url);
  228. }
  229. /**
  230. * 获取商户开户意愿确认状态
  231. * @author php迷途小书童
  232. * @created 2021/1/29 19:38
  233. */
  234. public function queryMerchantAuthStatus($merchant)
  235. {
  236. $data = [
  237. "agent_no"=> env('HAIKE.AGENT_NO'),
  238. "merch_no"=> $merchant['merch_no'],
  239. "wx_merch_no"=> $merchant['wx_merch_no'],
  240. ];
  241. $url = env('HAIKE.HOSTNAME')."/api/v1/wx-auth/query-merchant-auth-status";
  242. return self::request($data,$url);
  243. }
  244. /**
  245. * 查询申请单审核结果
  246. * @author php迷途小书童
  247. * @created 2021/1/29 19:38
  248. */
  249. public function queryMerchantApplyStatus($business_code)
  250. {
  251. $data = [
  252. "agent_no"=> env('HAIKE.AGENT_NO'),
  253. "business_code"=> $business_code,
  254. ];
  255. $url = env('HAIKE.HOSTNAME')."/api/v1/wx-auth/query-apply-status";
  256. return self::request($data,$url);
  257. }
  258. /**
  259. * 结算方式申请及变更
  260. * @return bool|string
  261. * @author php迷途小书童
  262. * @created 2021/2/2 17:39
  263. */
  264. public function merchantWithdrawalSetting($merchant = [])
  265. {
  266. $settlement_cycle = $merchant['settlement_cycle'] ?? 'D1';
  267. $d0_riche_time = $merchant['d0_riche_time'] ?? '15';
  268. $data = [
  269. "agent_no"=> env('HAIKE.AGENT_NO'),
  270. "merch_no"=> $merchant['merch_no'],
  271. "settlement_cycle" => $settlement_cycle,
  272. 'd0_riche_time' => $d0_riche_time,
  273. "withdrawal_rate" => $settlement_cycle != 'D0' ? "0" : "0.2",
  274. "withdrawal_feemin" => "0",
  275. ];
  276. $url = env('HAIKE.HOSTNAME')."/api/v1/merchant-withdrawal/setting";
  277. return self::request($data,$url);
  278. }
  279. /**
  280. * 商户申请微信业务
  281. * @return bool|string
  282. * @author php迷途小书童
  283. * @created 2021/1/27 14:03
  284. */
  285. public function wxApply($merchant)
  286. {
  287. $data = [
  288. "agent_no"=> env('HAIKE.AGENT_NO'),
  289. "merch_no"=> $merchant['merch_no'],
  290. "agent_apply_no"=> $merchant['agent_apply_no'],
  291. "notify_url"=> $merchant['apply_notice'],
  292. "rate"=> $merchant['rate'],
  293. "channel_no"=> env('HAIKE.WX_CHANNEL_NO'),
  294. "settle_id"=> $merchant['haike_wx_type'],
  295. ];
  296. $url = env('HAIKE.HOSTNAME')."/api/v1/merchant-wx-biz/apply";
  297. return self::request($data,$url);
  298. }
  299. /**
  300. * 支付宝业务申请
  301. * @return bool|string
  302. * @author php迷途小书童
  303. * @created 2021/1/27 14:16
  304. */
  305. public function aliApply($merchant)
  306. {
  307. $data = [
  308. "agent_no"=> env('HAIKE.AGENT_NO'),
  309. "merch_no"=> $merchant['merch_no'],
  310. "agent_apply_no"=> $merchant['agent_apply_no'],
  311. "notify_url"=> $merchant['apply_notice'],
  312. "rate"=> $merchant['rate'],
  313. "mcc"=> "0742",
  314. "channel_no"=> env('HAIKE.ALI_CHANNEL_NO'),
  315. "business_id"=> $merchant['haike_ali_type'],
  316. ];
  317. $url = env('HAIKE.HOSTNAME')."/api/v1/merchant-ali-biz/apply";
  318. return self::request($data,$url);
  319. }
  320. /**
  321. * 查询审核信息
  322. * @return bool|string
  323. * @author php迷途小书童
  324. * @created 2021/1/27 14:16
  325. */
  326. public function bizQuery($apply = [])
  327. {
  328. $data = [
  329. "agent_no"=> env('HAIKE.AGENT_NO'),
  330. "agent_apply_no"=> $apply['agent_apply_no'],
  331. "apply_type"=> (string)$apply['apply_type'],
  332. ];
  333. $url = env('HAIKE.HOSTNAME')."/api/v1/merchant-biz/query";
  334. return self::request($data,$url);
  335. }
  336. /**
  337. * 查询商户申请信息
  338. * @return bool|string
  339. * @author php迷途小书童
  340. * @created 2021/1/27 13:55
  341. */
  342. public function merchantInfo($merchant = [])
  343. {
  344. $url = env('HAIKE.HOSTNAME')."/api/v1/sub/query-merchant-info";
  345. $data = [
  346. "agent_no"=> env('HAIKE.AGENT_NO'),
  347. "merch_no"=> $merchant['merch_no'],
  348. ];
  349. return self::request($data,$url);
  350. }
  351. /**
  352. * 配置微信公众号
  353. * @return bool|string
  354. * @author php迷途小书童
  355. * @created 2021/1/26 17:00
  356. */
  357. public function wxAppidConfAdd($merchant = [])
  358. {
  359. $url = env('HAIKE.HOSTNAME')."/api/v1/wx-appid-conf/add";
  360. $data = [
  361. "agent_no"=> env('HAIKE.AGENT_NO'),
  362. "merch_no"=> $merchant['merch_no'],
  363. "conf_key"=> "pay_appId",
  364. "conf_value"=> $merchant['wx_appid'],
  365. ];
  366. return self::request($data,$url);
  367. }
  368. /**
  369. * 微信公众号配置查询
  370. * @return bool|string
  371. * @author php迷途小书童
  372. * @created 2021/1/26 17:00
  373. */
  374. public function wxAppidQuery($merchant = [])
  375. {
  376. $url = env('HAIKE.HOSTNAME')."/api/v1/wx-appid-conf/query";
  377. $data = [
  378. "agent_no"=> env('HAIKE.AGENT_NO'),
  379. "merch_no"=> $merchant['merch_no'],
  380. ];
  381. return self::request($data,$url);
  382. }
  383. /**
  384. * 微信费率变更
  385. * @return bool|string
  386. * @author php迷途小书童
  387. * @created 2021/1/28 9:19
  388. */
  389. public function wxRateModify($merchant = [])
  390. {
  391. $url = env('HAIKE.HOSTNAME')."/api/v1/merchant-wx-rate/modify";
  392. $data = [
  393. "agent_no"=> env('HAIKE.AGENT_NO'),
  394. "merch_no"=> $merchant['merch_no'],
  395. "agent_apply_no"=> "pay_appId",
  396. "rate" => $merchant['wx_rate'],
  397. "notify_url"=> "wx66f5f8def2b755da",
  398. ];
  399. return self::request($data,$url);
  400. }
  401. /**
  402. * 支付宝费率变更
  403. * @return bool|string
  404. * @author php迷途小书童
  405. * @created 2021/1/28 9:19
  406. */
  407. public function aliRateModify($merchant = [])
  408. {
  409. $url = env('HAIKE.HOSTNAME')."/api/v1/merchant-ali-rate/modify";
  410. $data = [
  411. "agent_no"=> env('HAIKE.AGENT_NO'),
  412. "merch_no"=> $merchant['merch_no'],
  413. "agent_apply_no"=> "pay_appId",
  414. "rate" => $merchant['wx_rate'],
  415. "notify_url"=> "wx66f5f8def2b755da",
  416. ];
  417. return self::request($data,$url);
  418. }
  419. /**
  420. * 发起支付
  421. * @return bool|string
  422. * @author php迷途小书童
  423. * @created 2021/2/5 17:29
  424. */
  425. public function getJsapiPayGateway($order,$notify_url = '/api/jsapiPay/notify')
  426. {
  427. $url = env('HAIKE.HOSTNAME')."/api/v1/pay/polymeric/jsapipay";
  428. $data=[
  429. "accesskey"=> env('HAIKE.ACCESS_KEY'),
  430. "trade_type" => $order['trade_type'],//支付方式微信支付:WX 支付宝支付:ALI 银联二维码支付:UNIONQR
  431. "merch_no"=> (string)$order['merch_no'],//商户号
  432. "out_trade_no" => $order['out_trade_no'],//商户单号
  433. "total_amount" => (string)$order['money'],//超时时间
  434. "userid" => (string)$order['pay_user_id'],//(支付宝/微信/银联二维码)的用户唯一标识
  435. // "sn" => "WSY196",//厂商终端号
  436. // "pn" => "S0000053",//SAAS终端号
  437. "remark" => "扫码支付",//交易备注
  438. "goods_name" => "扫码支付",
  439. "notify_url" => env('APP_URL').$notify_url,
  440. ];
  441. if ($order['trade_type'] == 'WX') {
  442. $data['appid'] = (string)env('HAIKE.APPID');
  443. }
  444. if ($order['type'] == 'mp') {
  445. $data['appid'] = (string)$order['appid'];
  446. }
  447. if ($order['pension'] <= 0) unset($data["ledger_relation"][0]);
  448. if ($order['service_money'] <= 0) unset($data["ledger_relation"][0]);
  449. // if ($order['pension'] > 0 && $order['service_money'] > 0) {
  450. // $data["ledger_relation"] = [
  451. // [//养老金金额
  452. // "receive_no" => "833102358121117",
  453. // "amt" => $order['pension']
  454. // ],
  455. // [//服务商金额
  456. // "receive_no" => "833102358121123",
  457. // "amt" => $order['service_money']
  458. // ]
  459. // ];
  460. // }
  461. // if ($order['pension'] <= 0 && $order['service_money'] > 0) {
  462. // $data["ledger_relation"] = [
  463. // [//服务商金额
  464. // "receive_no" => "833102358121123",
  465. // "amt" => $order['service_money']
  466. // ]
  467. // ];
  468. // }
  469. // if ($order['pension'] > 0 && $order['service_money'] <= 0) {
  470. // $data["ledger_relation"] = [
  471. // [//养老金金额
  472. // "receive_no" => "833102358121117",
  473. // "amt" => $order['pension']
  474. // ]
  475. // ];
  476. // }
  477. //分账修改:养老金金额并入服务商金额,修改服务商分账账户为众兴未来
  478. $amt = $order['service_money'] + $order['pension'];
  479. $data["ledger_relation"] = [
  480. [//服务商金额
  481. "receive_no" => "833102358121117",
  482. "amt" => (string)$amt
  483. ]
  484. // ,[//养老金金额
  485. // "receive_no" => "833102358121117",
  486. // "amt" => $order['pension']
  487. // ]
  488. ];
  489. log::info('发起支付:'.json_encode($data));
  490. return self::request($data,$url);
  491. }
  492. /**
  493. * 查询订单API
  494. * @return bool|string
  495. * @author php迷途小书童
  496. * @created 2021/1/15 16:29
  497. */
  498. public function doQueryOrder($out_trade_no){
  499. $url = env('HAIKE.HOSTNAME')."/api/v1/pay/polymeric/query";
  500. $data=[
  501. "out_trade_no" => $out_trade_no
  502. ];
  503. $res=self::request($data,$url);
  504. return $res;
  505. }
  506. /**
  507. * 关闭订单API
  508. * @return bool|string
  509. * @author php迷途小书童
  510. * @created 2021/1/15 16:29
  511. */
  512. public function doCloseOrder($out_trade_no){
  513. $url = env('HAIKE.HOSTNAME')."/api/v1/pay/polymeric/closeorder";
  514. $data = [
  515. "out_trade_no" => $out_trade_no,
  516. ];
  517. return self::request($data,$url);
  518. }
  519. /**
  520. * 申请退款API
  521. * @return bool|string
  522. * @author php迷途小书童
  523. * @created 2021/1/15 16:32
  524. */
  525. public function doRefundApply($order){
  526. $url = env('HAIKE.HOSTNAME')."/api/v1/pay/polymeric/refund";
  527. $data=[
  528. "out_trade_no" => $order['out_trade_no'],
  529. "out_refund_no" => $order['refund_no'],
  530. "refund_amount" => $order['money'],
  531. "notify_url" => env('APP_URL')."/api/jsapiPay/refund_notify",
  532. ];
  533. return self::request($data,$url);
  534. }
  535. /**
  536. * 退款查询API
  537. * @return bool|string
  538. * @author php迷途小书童
  539. * @created 2021/1/15 16:32
  540. */
  541. public function doRefundQuery($refund_no){
  542. $url = env('HAIKE.HOSTNAME')."/api/v1/pay/polymeric/refundquery";
  543. $data=[
  544. "refund_no"=> $refund_no
  545. ];
  546. return self::request($data,$url);
  547. }
  548. /**
  549. * 账户余额查询
  550. * @return bool|string
  551. * @author php迷途小书童
  552. * @created 2021/1/15 16:31
  553. */
  554. public function doBalanceQuery($merch_no){
  555. $url = env('HAIKE.HOSTNAME')."/api/v1/account/balance_query";
  556. $data=[
  557. "merch_no"=> "833226358120003"
  558. ];
  559. return self::request($data,$url);
  560. }
  561. /**
  562. * base64图片上传
  563. * @return bool|string
  564. * @author php迷途小书童
  565. * @created 2021/1/26 15:50
  566. */
  567. public function uploadImg($base64)
  568. {
  569. $url = env('HAIKE.HOSTNAME')."/api/v1/merchant-image/upload";
  570. $data = [
  571. "image"=> $base64
  572. ];
  573. return self::request($data,$url);
  574. }
  575. /**
  576. * 回调处理
  577. * @return boolean
  578. * @author php迷途小书童
  579. * @created 2021/1/16 14:46
  580. */
  581. public function doNotify(array $data){
  582. $accesskey = env('HAIKE.ACCESS_KEY');
  583. $haikeSign = $data['sign'];
  584. unset($data['sign']);
  585. $sign = strtoupper(self::getSignContent($data,$accesskey));
  586. if ($sign != $haikeSign)
  587. return false;
  588. return true;
  589. }
  590. /**
  591. * 生成签名
  592. * @return string
  593. * @author php迷途小书童
  594. * @created 2021/1/26 15:50
  595. */
  596. public static function getSignContent($data,$secret_key){
  597. ksort($data);
  598. $arrayToBeSigned = [];
  599. foreach ($data as $key => $value){
  600. if (is_array($value)) {
  601. $sonString = self::sortString($value);
  602. $arrayToBeSigned[] = $key . "=" . $sonString;
  603. } else {
  604. if (true === self::checkEmpty($value)) continue;
  605. $arrayToBeSigned[] = $key . "=" . $value;
  606. }
  607. }
  608. $stringToBeSigned = implode("&",$arrayToBeSigned);
  609. return md5($stringToBeSigned.$secret_key);
  610. }
  611. /**
  612. * 校验$value是否非空
  613. * @return bool
  614. * @author php迷途小书童
  615. * @created 2021/1/26 15:53
  616. */
  617. public static function checkEmpty($value) {
  618. if (!isset($value)) return true;
  619. if ($value === null) return true;
  620. if (trim($value) === "") return true;
  621. return false;
  622. }
  623. /**
  624. * 字符排序
  625. * @return string
  626. * @author php迷途小书童
  627. * @created 2021/1/26 15:50
  628. */
  629. public static function sortString($value){
  630. ksort($value);
  631. $sonArrayToBeSigned = [];
  632. if (is_array($value)) {
  633. if (array_keys($value) === range(0, count($value) - 1)) {
  634. if (!is_array($value[0])) {
  635. foreach ($value as $kindex => $vindex){
  636. $sonArrayToBeSigned[] =$vindex;
  637. }
  638. return implode("&", $sonArrayToBeSigned);
  639. }
  640. }
  641. }
  642. foreach ($value as $k => $v){
  643. if (is_array($v)) {
  644. $sonString = self::sortString($v);
  645. if (!is_numeric($k)) {
  646. $sonArrayToBeSigned[] = $k . "=" . $sonString;
  647. } else {
  648. $sonArrayToBeSigned[] = $sonString;
  649. }
  650. } else {
  651. if (true === self::checkEmpty($v)) continue;
  652. $sonArrayToBeSigned[] = $k . "=" . $v;
  653. }
  654. }
  655. return implode("&", $sonArrayToBeSigned);
  656. }
  657. /**
  658. * @return bool|string
  659. * @author php迷途小书童
  660. * @created 2021/1/15 16:32
  661. */
  662. public static function posturl($url,$data){
  663. $json = json_encode($data, JSON_UNESCAPED_UNICODE);
  664. $removeUrl = env('HAIKE.HOSTNAME')."/api/v1/merchant-image/upload";
  665. if ($url != $removeUrl)
  666. Log::info('【'.$url.'】:'.$json);
  667. $headerArray =array("Content-type:application/json;charset='utf-8'","Accept:application/json");
  668. $curl = curl_init();
  669. curl_setopt($curl, CURLOPT_URL, $url);
  670. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
  671. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);
  672. curl_setopt($curl, CURLOPT_POST, 1);
  673. curl_setopt($curl, CURLOPT_POSTFIELDS, $json);
  674. curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray);
  675. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  676. curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
  677. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
  678. $output = curl_exec($curl);
  679. curl_close($curl);
  680. return json_decode($output, true);
  681. }
  682. }