Pay.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\controller\Api;
  4. use think\Config;
  5. use think\Db;
  6. /**
  7. * 会员接口
  8. */
  9. class Pay extends Api
  10. {
  11. protected $noNeedLogin = ['notify'];
  12. protected $noNeedRight = '*';
  13. public function _initialize()
  14. {
  15. parent::_initialize();
  16. if (!Config::get('fastadmin.usercenter')) {
  17. $this->error(__('User center already closed'));
  18. }
  19. }
  20. //二合一支付
  21. public function pay() {
  22. $user_token = input('user_token', '', 'trim');
  23. if (!$user_token) {
  24. $this->error('参数缺失');
  25. }
  26. //生成支付订单记录
  27. $rechar_order['user_id'] = $this->auth->id;
  28. $rechar_order['order_no'] = date('YmdHis', time()) . $this->auth->id . rand(10000000, 99999999); //微信订单编号
  29. $rechar_order['money'] = 49;
  30. $rechar_order['purpose'] = 3; //充值用途:1=支付订单,2=充值,3=开通会员
  31. $rechar_order['pay_type'] = 'zhuowang';
  32. $rechar_order['relation_id'] = 1;
  33. $rechar_order['createtime'] = time();
  34. //开始事务
  35. $result = Db::name('rechar_order')->insertGetId($rechar_order);
  36. if (!$result) {
  37. $this->error('网络延迟,请稍后再试');
  38. }
  39. $url = 'http://' . config('pay_ip') . '/HDC/3.0/hop/svc/pay/toPay.ajax';
  40. $data = [
  41. 'transId' => $rechar_order['order_no'],
  42. 'orderNo' => $rechar_order['order_no'],
  43. 'userToken' => $user_token,
  44. 'notifyUrl' => config('img_url') . '/api/pay/notify',
  45. 'backUrl' => config('back_url'),
  46. 'deskCode' => config('desk_code'),
  47. 'products' => [
  48. [
  49. 'productCode' => config('product_code'),
  50. 'productPrice' => '29',
  51. 'productUnit' => '个',
  52. 'productCount' => 1
  53. ],
  54. [
  55. 'productCode' => '005912cp0028',
  56. 'productPrice' => '0',
  57. 'productUnit' => '7天体验',
  58. 'productCount' => 1
  59. ],
  60. [
  61. 'productCode' => '005912cp0004',
  62. 'productPrice' => '0',
  63. 'productUnit' => '30天体验',
  64. 'productCount' => 1
  65. ],
  66. [
  67. 'productCode' => '0002112cp0030',
  68. 'productPrice' => '0',
  69. 'productUnit' => '90天体验',
  70. 'productCount' => 1
  71. ],
  72. [
  73. 'productCode' => '005911cp0022',
  74. 'productPrice' => '199',
  75. 'productUnit' => '年度特惠',
  76. 'productCount' => 1
  77. ],
  78. [
  79. 'productCode' => '005912cp0051',
  80. 'productPrice' => '119',
  81. 'productUnit' => '半年特惠',
  82. 'productCount' => 1
  83. ],
  84. [
  85. 'productCode' => '005912cp0052',
  86. 'productPrice' => '59',
  87. 'productUnit' => '季度特惠',
  88. 'productCount' => 1
  89. ],
  90. [
  91. 'productCode' => '005912cp0035',
  92. 'productPrice' => '20',
  93. 'productUnit' => '两年特惠',
  94. 'productCount' => 1
  95. ],
  96. [
  97. 'productCode' => '005912cp0044',
  98. 'productPrice' => '20',
  99. 'productUnit' => '咪咕叠加包',
  100. 'productCount' => 1
  101. ],
  102. [
  103. 'productCode' => '005912cp0047',
  104. 'productPrice' => '30',
  105. 'productUnit' => '咪咕叠加包',
  106. 'productCount' => 1
  107. ],
  108. [
  109. 'productCode' => '005912cp0043',
  110. 'productPrice' => '20',
  111. 'productUnit' => '两年折扣',
  112. 'productCount' => 1
  113. ],
  114. [
  115. 'productCode' => '005912cp0034',
  116. 'productPrice' => '468',
  117. 'productUnit' => '两年特惠',
  118. 'productCount' => 1
  119. ],
  120. [
  121. 'productCode' => '005912cp0046',
  122. 'productPrice' => '49',
  123. 'productUnit' => '连续包月',
  124. 'productCount' => 1
  125. ],
  126. [
  127. 'productCode' => '005912cp0039',
  128. 'productPrice' => '12',
  129. 'productUnit' => '一日会员',
  130. 'productCount' => 1
  131. ],
  132. [
  133. 'productCode' => '0002112cp0031T1',
  134. 'productPrice' => '1',
  135. 'productUnit' => '畅享折扣',
  136. 'productCount' => 1
  137. ],
  138. [
  139. 'productCode' => '0002112cp0031T9',
  140. 'productPrice' => '9',
  141. 'productUnit' => '畅享折扣',
  142. 'productCount' => 1
  143. ],
  144. [
  145. 'productCode' => '0002112cp0031T19',
  146. 'productPrice' => '19',
  147. 'productUnit' => '畅享折扣',
  148. 'productCount' => 1
  149. ],
  150. [
  151. 'productCode' => '0002112cp0029',
  152. 'productPrice' => '29',
  153. 'productUnit' => '限时特惠',
  154. 'productCount' => 1
  155. ],
  156. [
  157. 'productCode' => '005912cp0002',
  158. 'productPrice' => '35',
  159. 'productUnit' => '畅享特惠',
  160. 'productCount' => 1
  161. ],
  162. [
  163. 'productCode' => '0002112cp0031Z39',
  164. 'productPrice' => '39',
  165. 'productUnit' => '畅享会员',
  166. 'productCount' => 1
  167. ],
  168. [
  169. 'productCode' => '0002112cp0031',
  170. 'productPrice' => '39',
  171. 'productUnit' => '畅享会员',
  172. 'productCount' => 1
  173. ],
  174. [
  175. 'productCode' => '005912cp0040',
  176. 'productPrice' => '39',
  177. 'productUnit' => '月包会员',
  178. 'productCount' => 1
  179. ],
  180. [
  181. 'productCode' => '005912cp0036',
  182. 'productPrice' => '105',
  183. 'productUnit' => '连续包季',
  184. 'productCount' => 1
  185. ],
  186. [
  187. 'productCode' => '005912cp0021',
  188. 'productPrice' => '299',
  189. 'productUnit' => '连续包年',
  190. 'productCount' => 1
  191. ],
  192. [
  193. 'productCode' => '005912cp0012',
  194. 'productPrice' => '365',
  195. 'productUnit' => '连续包年',
  196. 'productCount' => 1
  197. ],
  198. [
  199. 'productCode' => '005912cp0037',
  200. 'productPrice' => '59',
  201. 'productUnit' => '30天会员',
  202. 'productCount' => 1
  203. ],
  204. [
  205. 'productCode' => '005911cp0001',
  206. 'productPrice' => '111',
  207. 'productUnit' => '季度会员',
  208. 'productCount' => 1
  209. ],
  210. [
  211. 'productCode' => '005911cp0005',
  212. 'productPrice' => '209',
  213. 'productUnit' => '半年会员',
  214. 'productCount' => 1
  215. ],
  216. [
  217. 'productCode' => '005911cp0002',
  218. 'productPrice' => '399',
  219. 'productUnit' => '年度会员',
  220. 'productCount' => 1
  221. ],
  222. [
  223. 'productCode' => '008888cp0004',
  224. 'productPrice' => '399',
  225. 'productUnit' => '线下年包',
  226. 'productCount' => 1
  227. ],
  228. [
  229. 'productCode' => '2400000560_YRHY',
  230. 'productPrice' => '5',
  231. 'productUnit' => '一日会员',
  232. 'productCount' => 1
  233. ],
  234. [
  235. 'productCode' => '005912cp0017',
  236. 'productPrice' => '39',
  237. 'productUnit' => '手柄',
  238. 'productCount' => 1
  239. ],
  240. [
  241. 'productCode' => '2000012947_ZY',
  242. 'productPrice' => '39',
  243. 'productUnit' => '手柄',
  244. 'productCount' => 1
  245. ]
  246. ]
  247. ];
  248. $data = json_encode($data, 320);
  249. //获取鉴权token
  250. $sign_bytes = '/3.0/hop/svc/pay/toPay.ajax' . $this->base16_encode(md5($data));
  251. $hdc_token = hash_hmac('sha256', $sign_bytes, base64_decode(config('pay_appkey')), false);
  252. $header = [
  253. 'Host:' . config('pay_ip'),
  254. 'HDC-Service:2',
  255. 'HDC-APPID:' . config('pay_appid'),
  256. 'HDC-Token:' . $hdc_token,
  257. 'Content-Type:application/json'
  258. ];
  259. $rs = httpRequest($url, 'POST', $data, $header);
  260. if (!$rs) {
  261. $this->error('您的网络开小差了~');
  262. }
  263. $rs = json_decode($rs, true);
  264. if ($rs['resultCode'] != 0) {
  265. $this->error('您的网络开小差了~');
  266. }
  267. $this->success('链接', $rs['data']);
  268. }
  269. //支付回调
  270. public function notify() {
  271. $data = file_get_contents('php://input');
  272. if (!$data) {
  273. $this->error('参数缺失');
  274. }
  275. $data = json_decode($data, true);
  276. if (!$data) {
  277. $this->error('参数缺失');
  278. }
  279. if ($data['orderstate'] != 0) {
  280. echo json_encode([
  281. 'transid' => $data['transid'],
  282. 'orderid' => $data['orderid'],
  283. 'statuscode' => -1,
  284. 'statusdesc' => '订单状态失败'
  285. ], 320);
  286. die;
  287. }
  288. $order_no = $data['orderid'];
  289. $where['order_no'] = $order_no;
  290. $order_info = Db::name('rechar_order')->where($where)->find();
  291. if (!$order_info) {
  292. echo json_encode([
  293. 'transid' => $data['transid'],
  294. 'orderid' => $data['orderid'],
  295. 'statuscode' => -1,
  296. 'statusdesc' => '业务订单不存在'
  297. ], 320);
  298. die;
  299. }
  300. if ($order_info['status'] == 1) { //已回调成功
  301. echo json_encode([
  302. 'transid' => $data['transid'],
  303. 'orderid' => $data['orderid'],
  304. 'statuscode' => 0,
  305. 'statusdesc' => ''
  306. ], 320);
  307. die;
  308. }
  309. //构建支付订单处理结果信息
  310. $_data['status'] = 1;
  311. $_data['updatetime'] = time();
  312. if ($order_info['purpose'] == 3) {
  313. //开通会员
  314. Db::startTrans();
  315. //充值
  316. $rs = Db::name('user')->where(['id' => $order_info['user_id']])->setField('is_vip', 1);
  317. if ($rs === false) {
  318. Db::rollback();
  319. $_data['pay_status'] = 3; //回调状态:1=支付订单回调失败,2=充值回调失败,3=开通会员回调失败
  320. } else {
  321. Db::commit();
  322. }
  323. }
  324. //修改订单信息
  325. Db::name('rechar_order')->where($where)->setField($_data);
  326. echo json_encode([
  327. 'transid' => $data['transid'],
  328. 'orderid' => $data['orderid'],
  329. 'statuscode' => 0,
  330. 'statusdesc' => ''
  331. ], 320);
  332. }
  333. }