PayNotifyCoin.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821
  1. <?php
  2. /**
  3. * 支付的服务器异步通知控制器
  4. *
  5. */
  6. namespace app\api\controller\v1;
  7. use app\api\controller\Api;
  8. use app\api\service\PayNotifyService;
  9. use app\common\factory\Pay as NotifPay;
  10. use app\common\model\MemberCoinInfo;
  11. use app\common\model\MemberCoinPay;
  12. use app\common\model\Pay;
  13. use app\common\model\PayCpinfo;
  14. use app\common\model\Members;
  15. use app\common\logic\PayCallback;
  16. use app\common\logic\Pay as PayLogic;
  17. use app\common\library\WeixinPay;
  18. use think\Config;
  19. use think\Db;
  20. use think\Env;
  21. class PayNotifyCoin extends Api
  22. {
  23. /**
  24. * 不进行父类的登录验证,所以增加构造方法重写了父类的初始化方法
  25. */
  26. public function _initialize()
  27. {
  28. $log_postdata = '';
  29. try {
  30. $postData = input();
  31. if (!$postData) {
  32. $postData = request()->getInput();
  33. }
  34. // foreach ($postData as $k => $v) {
  35. // $log_postdata .= $k . ':' . $v . ' ';
  36. // }
  37. $log_postdata = json_encode($postData);
  38. log_message('支付订单回调: '.request()->url().' '.$log_postdata,'log',LOG_PATH . 'PayNotifyCoin/');
  39. } catch (\Exception $e) {
  40. }
  41. }
  42. /**
  43. * 支付宝服务器异步通知页面方法
  44. */
  45. public function alipay()
  46. {
  47. vendor('alipay.lib.AlipayNotify');
  48. $alipayNotify = new \AlipayNotify(Config::get('alipay'));
  49. if ($result = $alipayNotify->verifyNotify()) {
  50. // 处理支付成功后的逻辑业务
  51. if (input('post.trade_status') == 'TRADE_SUCCESS') {
  52. $out_trade_no = input('out_trade_no'); //订单号
  53. //写入日志
  54. log_message("## alipay: ". $out_trade_no .' - '. $result, 'log', LOG_PATH . '../paylog/');
  55. if (!empty($out_trade_no)) {
  56. //更新订单状态处理
  57. (new PayNotifyService())->updateOrderCoin($out_trade_no, input('total_fee'));
  58. }
  59. echo 'success';
  60. exit; //请不要修改或删除
  61. }
  62. echo 'fail';
  63. exit; //验证失败
  64. }
  65. echo 'fail';
  66. exit;
  67. }
  68. /**
  69. * 支付宝Aop支付服务器异步通知页面方法
  70. */
  71. public function alipayAop()
  72. {
  73. //Alipay Aop Sdk支付回调
  74. vendor('alipayAop.AopSdk');
  75. $app_id = input('app_id');
  76. $out_trade_no = input('out_trade_no', ''); //订单号
  77. $configs = Config::get('ali_pay_config');
  78. $configs_list = array_keys($configs['configs']);
  79. if(!in_array($app_id, $configs_list)){
  80. ddMsg('warning', '', ['PayNotifyCoin.alipayAop.fail', '回调时 appId 配置不存在!', $app_id.'-'.$out_trade_no]);
  81. echo "fail";
  82. exit; //验证失败
  83. }
  84. $aop = new \AopClient();
  85. $aop->alipayrsaPublicKey = $configs['configs'][$app_id]['public_key'];
  86. $result = $aop->rsaCheckV1(input(), NULL, $configs['sign_type']);
  87. // 写入日志
  88. log_message("## alipayAop: ". $out_trade_no.' - '.($result?"success":"fail"), 'log', LOG_PATH . '../paylog/');
  89. if ($result) {
  90. // 处理支付成功后的逻辑业务
  91. if (input('post.trade_status') == 'TRADE_SUCCESS') {
  92. if (!empty($out_trade_no)) {
  93. //更新订单状态处理
  94. (new PayNotifyService())->updateOrderCoin($out_trade_no, input('total_fee'));
  95. }
  96. echo 'success';
  97. exit; //请不要修改或删除
  98. }
  99. echo 'fail';
  100. exit; //验证失败
  101. }
  102. ddMsg('weelfar', '', ['PayNotifyCoin.alipayAop.fail', '回调失败', $app_id.'-'.$out_trade_no]);
  103. echo 'fail';
  104. exit;
  105. }
  106. /**
  107. * 威富通-微信 支付完成回调处理
  108. *
  109. */
  110. public function swiftpay()
  111. {
  112. vendor('swiftpay.ClientResponseHandler', '.class.php');
  113. $resHandler = new \ClientResponseHandler(); //后台应答类
  114. $xml = file_get_contents('php://input');
  115. //写入日志
  116. log_message($xml, 'log', LOG_PATH . '../paylog/');
  117. $resHandler->setContent($xml);
  118. $resHandler->setKey(Config::get('swiftpay')['key']);
  119. //签名验证
  120. if ($resHandler->isTenpaySign()) {
  121. if ($resHandler->getParameter('status') == 0 && $resHandler->getParameter('result_code') == 0) {
  122. //支付成功时
  123. if ($resHandler->getParameter('pay_result') == 0) {
  124. $orderid = $resHandler->getParameter('out_trade_no');
  125. $total_fee = $resHandler->getParameter('total_fee') / 100; //金额,分为单位
  126. //订单编号不为空时
  127. if (!empty($orderid)) {
  128. //更新订单状态处理
  129. (new PayNotifyService())->updateOrderCoin($orderid, $total_fee);
  130. }
  131. } else {
  132. //写入日志
  133. log_message('支付失败', 'error', LOG_PATH . '../paylog/');
  134. }
  135. echo 'success';
  136. exit();
  137. } else {
  138. echo 'failure1';
  139. exit();
  140. }
  141. } else {
  142. //写入日志
  143. log_message('威富通-微信 支付签名验证失败', 'error', LOG_PATH . '../paylog/');
  144. echo 'failure2';
  145. exit();
  146. }
  147. exit();
  148. }
  149. /**
  150. * 威富通中信银行-微信WAP支付回调处理
  151. *
  152. */
  153. public function swiftccbwxpay()
  154. {
  155. vendor('swiftpay.ClientResponseHandler', '.class.php');
  156. $resHandler = new \ClientResponseHandler(); //后台应答类
  157. $xml = file_get_contents('php://input');
  158. //写入日志
  159. log_message($xml, 'log', LOG_PATH . '../paylog/');
  160. $resHandler->setContent($xml);
  161. $resHandler->setRSAKey(Config::get('swiftccbwxpay')['public_key']);
  162. $resHandler->setParameter('sign_type', 'RSA_1_256');
  163. //签名验证
  164. if ($resHandler->isTenpaySign()) {
  165. if ($resHandler->getParameter('status') == 0 && $resHandler->getParameter('result_code') == 0) {
  166. //支付成功时
  167. if ($resHandler->getParameter('pay_result') == 0) {
  168. $orderid = $resHandler->getParameter('out_trade_no');
  169. $total_fee = $resHandler->getParameter('total_fee') / 100; //金额,分为单位
  170. //订单编号不为空时
  171. if (!empty($orderid)) {
  172. //更新订单状态处理
  173. (new PayNotifyService())->updateOrderCoin($orderid, $total_fee);
  174. }
  175. } else {
  176. //写入日志
  177. log_message('支付失败', 'error', LOG_PATH . '../paylog/');
  178. }
  179. echo 'success';
  180. exit();
  181. } else {
  182. echo 'failure1';
  183. exit();
  184. }
  185. } else {
  186. //写入日志
  187. log_message('威富通-微信 支付签名验证失败', 'error', LOG_PATH . '../paylog/');
  188. echo 'failure2';
  189. exit();
  190. }
  191. exit();
  192. }
  193. /**
  194. * 第三方 现在支付完成回调处理
  195. *
  196. */
  197. public function zfbxjzfipaynow()
  198. {
  199. //返回的参数
  200. $res = file_get_contents('php://input');
  201. //写入日志
  202. log_message('现在支付回调参数:' . $res, 'log', LOG_PATH . '../paylog/');
  203. $Arr = array();
  204. $res = explode('&', $res);
  205. //写入日志
  206. log_message('现在支付explode处理后的回调参数:' . print_r($res, true), 'log', LOG_PATH . '../paylog/');
  207. foreach ($res as $v) {
  208. $value = explode('=', $v);
  209. $Arr[$value[0]] = urldecode($value[1]);
  210. }
  211. $signatrue = $this->getIpaynowSignTrue($Arr, Config::get('h5_alipay_config')['key']);
  212. if ($signatrue == $Arr['signature']) {
  213. $orderid = $Arr['mhtOrderNo'];
  214. $mhtOrderAmt = $Arr['mhtOrderAmt'] / 100; //商户订单交易金额,以分为单位
  215. //订单编号不为空时
  216. if (!empty($orderid)) {
  217. //更新订单状态处理
  218. (new PayNotifyService())->updateOrderCoin($orderid, $mhtOrderAmt);
  219. }
  220. //异步通知验签通过,在此处写业务逻辑
  221. echo 'success=Y';
  222. } else {
  223. //写入日志
  224. log_message('现在支付签名验证失败', 'error', LOG_PATH . '../paylog/');
  225. //异步通知验签失败,在此处写业务逻辑
  226. echo 'success=N';
  227. }
  228. }
  229. /**
  230. * 现在支付完成回调处理
  231. *
  232. */
  233. public function ipaynow()
  234. {
  235. //返回的参数
  236. $res = file_get_contents('php://input');
  237. //写入日志
  238. log_message('现在支付回调参数:' . $res, 'log', LOG_PATH . '../paylog/');
  239. $Arr = array();
  240. $res = explode('&', $res);
  241. //写入日志
  242. log_message('现在支付explode处理后的回调参数:' . print_r($res, true), 'log', LOG_PATH . '../paylog/');
  243. foreach ($res as $v) {
  244. $value = explode('=', $v);
  245. $Arr[$value[0]] = urldecode($value[1]);
  246. }
  247. $signatrue = $this->getIpaynowSignTrue($Arr, Config::get('h5_alipay_config')['key']);
  248. if ($signatrue == $Arr['signature']) {
  249. $orderid = $Arr['mhtOrderNo'];
  250. $mhtOrderAmt = $Arr['mhtOrderAmt'] / 100; //商户订单交易金额,以分为单位
  251. //订单编号不为空时
  252. if (!empty($orderid)) {
  253. //更新订单状态处理
  254. (new PayNotifyService())->updateOrderCoin($orderid, $mhtOrderAmt);
  255. }
  256. //异步通知验签通过,在此处写业务逻辑
  257. echo 'success=Y';
  258. } else {
  259. //写入日志
  260. log_message('现在支付签名验证失败', 'error', LOG_PATH . '../paylog/');
  261. //异步通知验签失败,在此处写业务逻辑
  262. echo 'success=N';
  263. }
  264. }
  265. /**
  266. * 对现在支付回调的请求报文做签名验证,
  267. * copy现在支付demo代码中controller.php的getSignTrue方法
  268. *
  269. * @param $Arr array 报文参数
  270. * @param $key string
  271. *
  272. * @return mix
  273. */
  274. private function getIpaynowSignTrue($Arr, $key)
  275. {
  276. if (!empty($Arr)) {
  277. ksort($Arr);
  278. $str = '';
  279. foreach ($Arr as $k => $v) {
  280. if ($v == '' || $k == 'signature') {
  281. continue;
  282. }
  283. $str .= $k . '=' . $v . '&';
  284. }
  285. if ($key == 'post') {
  286. return substr($str, 0, -1);
  287. } else {
  288. return strtolower(md5($str . md5($key)));
  289. }
  290. }
  291. return false;
  292. }
  293. /**
  294. * 微信官方h5支付
  295. */
  296. public function wxpayh5()
  297. {
  298. $request_data = file_get_contents('php://input');
  299. //写入日志
  300. log_message('微信h5支付回调参数:' . $request_data, 'log', LOG_PATH . '../paylog/');
  301. $wxPay = new WeixinPay;
  302. $data = $wxPay->xmlToArray($request_data);
  303. $data = array_filter($data);
  304. $source_sign = $data['sign']; // 接收到的签名
  305. unset($data['sign']); // 参数中的sign不参与签名
  306. //生成的签名
  307. $sign = $wxPay->MakeSign($data, Config::get('wxpay-h5')['key']);
  308. //验签失败
  309. if ($source_sign !== $sign) {
  310. $return['return_code'] = 'failure';
  311. $return['return_msg'] = 'NO';
  312. //写入日志
  313. log_message('微信官方h5支付签名验证失败:' . print_r($data, true), 'error', LOG_PATH . '../paylog/');
  314. } elseif ('SUCCESS' != $data['result_code']) {
  315. $return['return_code'] = 'failure';
  316. $return['return_msg'] = 'NO';
  317. //写入日志
  318. log_message('微信官方h5支付错误代码:' . $data['err_code'] . '; 错误信息: ' . $data['err_code_des'], 'error', LOG_PATH . '../paylog/');
  319. } else {
  320. $orderid = $data['out_trade_no'];
  321. $amount = $data['total_fee'] / 100; //商户订单交易金额,以分为单位
  322. //订单编号不为空时
  323. if (!empty($orderid)) {
  324. //更新订单状态处理
  325. (new PayNotifyService())->updateOrderCoin($orderid, $amount);
  326. }
  327. $return['return_code'] = 'SUCCESS';
  328. $return['return_msg'] = 'OK';
  329. }
  330. echo dataToXml($return);
  331. exit;
  332. }
  333. /**
  334. * 米花微信h5支付
  335. */
  336. public function wxpayh5mihua()
  337. {
  338. $request_data = file_get_contents('php://input');
  339. //写入日志
  340. log_message('米花微信h5支付回调参数:' . $request_data, 'log', LOG_PATH . '../paylog/');
  341. vendor('mihuaSdk.Mihua', '.class.php');
  342. $mihua = new \Mihua();
  343. $data = $_GET['data'];
  344. $retjson = $mihua->notifyVerify($data);
  345. if ($retjson && $retjson['orderStatus'] == 'SUCCESS') {
  346. $orderid = $retjson['orderId'];
  347. $amount = floatval($retjson['amount']);
  348. //订单编号不为空时
  349. if (!empty($orderid)) {
  350. //更新订单状态处理
  351. (new PayNotifyService())->updateOrderCoin($orderid, $amount);
  352. }
  353. echo "SUCCESS";
  354. die();
  355. } else {
  356. log_message('米花微信h5支付签名验证失败:' . print_r($data, true), 'error', LOG_PATH . '../paylog/');
  357. echo 'FAIL';
  358. exit();
  359. }
  360. }
  361. /**
  362. * 米花支付宝h5支付
  363. */
  364. public function zfbh5mihua()
  365. {
  366. $request_data = file_get_contents('php://input');
  367. //写入日志
  368. log_message('米花支付宝h5支付回调参数:' . $request_data, 'log', LOG_PATH . '../paylog/');
  369. vendor('mihuaSdk.Mihuazfb', '.class.php');
  370. $mihua = new \Mihuazfb();
  371. $data = $_GET['data'];
  372. $retjson = $mihua->notifyVerify($data);
  373. if ($retjson && $retjson['orderStatus'] == 'SUCCESS') {
  374. $orderid = $retjson['orderId'];
  375. $amount = floatval($retjson['amount']);
  376. //订单编号不为空时
  377. if (!empty($orderid)) {
  378. //更新订单状态处理
  379. (new PayNotifyService())->updateOrderCoin($orderid, $amount);
  380. }
  381. echo "SUCCESS";
  382. die();
  383. } else {
  384. log_message('米花支付宝h5支付签名验证失败:' . print_r($data, true), 'error', LOG_PATH . '../paylog/');
  385. echo 'FAIL';
  386. exit();
  387. }
  388. }
  389. /**
  390. * 快接微信h5支付
  391. */
  392. public function wxpayh5kj()
  393. {
  394. $request_data = file_get_contents('php://input');
  395. //写入日志
  396. log_message('快接微信h5支付回调参数:' . $request_data, 'log', LOG_PATH . '../paylog/');
  397. vendor('kjpaySdk.Kjpay', '.class.php');
  398. $kjpay = new \Kjpay();
  399. $data = $_POST;
  400. $retjson = $kjpay->notifyVerify($data);
  401. if ($retjson && $retjson['status'] == 'Success') {
  402. $orderid = $retjson['merchant_order_no'];
  403. $amount = floatval($retjson['amount']);
  404. //订单编号不为空时
  405. if (!empty($orderid)) {
  406. //更新订单状态处理
  407. (new PayNotifyService())->updateOrderCoin($orderid, $amount);
  408. }
  409. echo "success";
  410. die();
  411. } else {
  412. log_message('快接微信h5支付签名验证失败:' . print_r($data, true), 'error', LOG_PATH . '../paylog/');
  413. echo 'fail';
  414. exit();
  415. }
  416. }
  417. /**
  418. * 快接支付宝h5支付
  419. */
  420. public function zfbh5kj()
  421. {
  422. $request_data = file_get_contents('php://input');
  423. //写入日志
  424. log_message('快接支付宝h5支付回调参数:' . $request_data, 'log', LOG_PATH . '../paylog/');
  425. vendor('kjpaySdk.Kjzfb', '.class.php');
  426. $kjpay = new \Kjzfb();
  427. $data = $_POST;
  428. $retjson = $kjpay->notifyVerify($data);
  429. if ($retjson && $retjson['status'] == 'Success') {
  430. $orderid = $retjson['merchant_order_no'];
  431. $amount = floatval($retjson['amount']);
  432. //订单编号不为空时
  433. if (!empty($orderid)) {
  434. //更新订单状态处理
  435. (new PayNotifyService())->updateOrderCoin($orderid, $amount);
  436. }
  437. echo "success";
  438. die();
  439. } else {
  440. log_message('快接支付宝h5支付签名验证失败:' . print_r($data, true), 'error', LOG_PATH . '../paylog/');
  441. echo 'fail';
  442. exit();
  443. }
  444. }
  445. /**
  446. * 商盟微信h5支付
  447. */
  448. public function wxpayh5sumpay()
  449. {
  450. $request_data = file_get_contents('php://input');
  451. //写入日志
  452. log_message('商盟微信h5支付回调参数:' . $request_data, 'log', LOG_PATH . '../paylog/');
  453. vendor('sumpaySdk.Sumpay', '.class.php');
  454. $sumpay = new \Sumpay();
  455. $retData = array();
  456. $data = $_REQUEST;
  457. $retjson = $sumpay->notifyVerify($data);
  458. if ($retjson && $retjson['status'] == '1') {
  459. $orderid = trim($retjson['orderNo']);
  460. $amount = floatval($retjson['orderAmount']);
  461. //订单编号不为空时
  462. if (!empty($orderid)) {
  463. //更新订单状态处理
  464. (new PayNotifyService())->updateOrderCoin($orderid, $amount);
  465. }
  466. $retData['code'] = '10000';
  467. echo json_encode($retData);
  468. exit();
  469. } else {
  470. log_message('商盟微信h5支付签名验证失败:' . print_r($data, true), 'error', LOG_PATH . '../paylog/');
  471. $retData['code'] = '30000';
  472. echo json_encode($retData);
  473. exit();
  474. }
  475. }
  476. /**
  477. * 酷点h5支付
  478. */
  479. public function kdh5zhifu()
  480. {
  481. $request_data = file_get_contents('php://input');
  482. log_message('酷点h5支付回调参数:' . $request_data, 'log', LOG_PATH . '../paylog/');
  483. vendor('kdpaySdk.des');
  484. $sumpay = new \kdpay();
  485. $data = json_decode($request_data, true);
  486. $res_result = json_decode($data['result'], true);
  487. if ($res_result['status'] == '100') {
  488. $retjson = $sumpay->notifyVerify($data);
  489. if ($retjson == $data['sign']) {
  490. $orderid = trim($res_result['out_trade_no']);
  491. $amount = floatval($res_result['fee'] / 100);
  492. //订单编号不为空时
  493. if (!empty($orderid)) {
  494. //更新订单状态处理
  495. (new PayNotifyService())->updateOrderCoin($orderid, $amount,$res_result['transaction_id']);
  496. }
  497. echo "success";
  498. die();
  499. } else {
  500. echo 'fail';
  501. exit();
  502. }
  503. } else {
  504. echo '支付失败';
  505. exit();
  506. }
  507. }
  508. /**
  509. * 汇付宝 微信H5支付回调
  510. */
  511. public function wxwapnotify()
  512. {
  513. //$param = request()->param();
  514. //写入日志
  515. //log_message('回调参数'.json_encode($param),'error',LOG_PATH . '../paylog/');
  516. $sign_key = Config::get('wxwappay-h5')['key'];
  517. $result = $_GET['result'];
  518. $pay_message = $_GET['pay_message'];
  519. $agent_id = $_GET['agent_id'];
  520. $jnet_bill_no = $_GET['jnet_bill_no'];
  521. $agent_bill_id = $_GET['agent_bill_id'];
  522. $pay_type = $_GET['pay_type'];
  523. $pay_amt = $_GET['pay_amt'];
  524. $remark = "";
  525. $return_sign = $_GET['sign'];
  526. $signStr = '';
  527. $signStr = $signStr . 'result=' . $result;
  528. $signStr = $signStr . '&agent_id=' . $agent_id;
  529. $signStr = $signStr . '&jnet_bill_no=' . $jnet_bill_no;
  530. $signStr = $signStr . '&agent_bill_id=' . $agent_bill_id;
  531. $signStr = $signStr . '&pay_type=' . $pay_type;
  532. $signStr = $signStr . '&pay_amt=' . $pay_amt;
  533. $signStr = $signStr . '&remark=' . $remark;
  534. $signStr = $signStr . '&key=' . $sign_key; //商户签名密钥
  535. $sign = '';
  536. $sign = md5($signStr);
  537. if ($sign == $return_sign) { //比较签名密钥结果是否一致,一致则保证了数据的一致性
  538. //订单编号不为空时
  539. if (!empty($agent_bill_id)) {
  540. //更新订单状态处理
  541. (new PayNotifyService())->updateOrderCoin($agent_bill_id, $pay_amt);
  542. }
  543. echo "success";
  544. die();
  545. } else {
  546. echo 'fail';
  547. exit();
  548. }
  549. }
  550. /**
  551. * 汇付宝 微信H5支付回调
  552. */
  553. public function wxwapreturn()
  554. {
  555. echo 'fail';
  556. exit();
  557. }
  558. // 易宝支付 - 支付回调
  559. public function ybzf_pay(){
  560. // 文档: https://www.eolink.com/share/inside/f8LYBC/api/2161864/detail/48968582
  561. $postData = input();
  562. if($postData['returncode'] != '0000'){
  563. ddMsg('warning', '', ['PayNotifyCoin.ybzf_pay.fail', '易宝支付失败通知过来!', $postData['paytype'].'-'.$postData['orderno']]);
  564. echo "fail";
  565. exit();
  566. }
  567. $private_key = Config::get('ybzf_pay')['private_key'];
  568. // 签名要求: MD5(paytime=xxx|orderno=xxxxx|payno=xxxx|paytype=xxx|productprice=xxxx|商户密钥)
  569. $signData = [
  570. 'paytime' => $postData['paytime'],
  571. 'orderno' => $postData['orderno'],
  572. 'payno' => $postData['payno'],
  573. 'paytype' => $postData['paytype'],
  574. 'productprice' => $postData['productprice'],
  575. ];
  576. $signHandle = '';
  577. foreach ($signData as $k=>$v) {
  578. if($signHandle){
  579. $signHandle .= '|';
  580. }
  581. $signHandle .= $k.'='.$v;
  582. }
  583. $sign = md5($signHandle.'|'.$private_key);
  584. $result = $postData['sign'] == $sign;
  585. //写入日志
  586. log_message("## alipay: ". $signData['orderno'] .' - '. $result, 'log', LOG_PATH . '../paylog/');
  587. if($result){
  588. if (!empty($signData['orderno'])) {
  589. // 更新订单状态处理
  590. (new PayNotifyService())->updateOrderCoin($signData['orderno'], formatFenToYuan($postData['productprice']), $postData['transactionId']??'');
  591. }
  592. echo "success";
  593. exit();
  594. }
  595. ddMsg('weelfar', '', ['PayNotifyCoin.ybzf_pay.fail', '回调失败!', $postData['paytype'] . '-' . $postData['orderno']]);
  596. echo "fail";
  597. exit();
  598. }
  599. // 联动优势-微信小程序 - 支付回调
  600. public function ldzf_wx_pay()
  601. {
  602. $input = input();
  603. if (!$input) {
  604. $input = request()->getInput();
  605. }
  606. $result = NotifPay::makeNotify('ldys_pay', $input);
  607. if ($result['error'] == false) {
  608. (new PayNotifyService())->updateOrderCoin($input['order_id'], formatFenToYuan($input['amount']), $input['trade_no'] ?? '');
  609. echo NotifPay::makeReturnNotify("ldys_pay", $result['result']);
  610. exit();
  611. }
  612. echo NotifPay::makeReturnNotify('ldys_pay', 'fail');
  613. exit();
  614. }
  615. // 趣智连支付 - 支付回调
  616. public function qzl_pay()
  617. {
  618. $input = input();
  619. if (!$input) {
  620. $input = request()->getInput();
  621. }
  622. $result = NotifPay::makeNotify('qzl_pay', $input);
  623. if ($result['result'] == "success") {
  624. (new PayNotifyService())->updateOrderCoin($input['mchOrderNo'], formatFenToYuan($input['amount']), $input['cpOrderNo'] ?? '');
  625. }
  626. echo $result['result'];
  627. exit();
  628. }
  629. // 优亿(原趣智连) - 支付回调
  630. public function yyyb_pay()
  631. {
  632. $input = input();
  633. if (!$input) {
  634. $input = request()->getInput();
  635. }
  636. $result = NotifPay::makeNotify('yyyb_pay', $input);
  637. if ($result['result'] == 'success') {
  638. (new PayNotifyService())->updateOrderCoin($input['mchOrderNo'], formatFenToYuan($input['amount']), $input['cpOrderNo'] ?? '');
  639. echo NotifPay::makeReturnNotify("yyyb_pay", $result['result']);
  640. exit();
  641. }
  642. echo NotifPay::makeReturnNotify('yyyb_pay', 'fail');
  643. exit();
  644. }
  645. // 喜钛游
  646. public function xty_pay()
  647. {
  648. $input = input();
  649. if (!$input) {
  650. $input = request()->getInput();
  651. }
  652. if(!$input){
  653. echo "fail: 请求参数有误!";
  654. exit();
  655. }
  656. // $input = '{"charset":"UTF-8","req_data":"{\"order_no\":\"1010371322026022200352556523\",\"pay_scene\":\"H5\",\"order_desc\":\"\u5e73\u53f0\u5e01\",\"order_name\":\"\u5e73\u53f0\u5e01\",\"pay_time\":\"20260222003613\",\"ch_order_no\":\"4200002988202602220374801880\",\"payer_account\":\"oAVOM60yzBizuw5vxRiFFMBfIse8\",\"out_trade_no\":\"COIN17716917252403110705\",\"total_amount\":50000,\"reserved\":\"\",\"ch_out_trade_no\":\"5360376246260222\",\"trade_status\":\"SUCCESS\",\"pay_channel\":\"WX\",\"payer_id\":\"oAVOM60yzBizuw5vxRiFFMBfIse8\"}","method":"trade.order.notify","app_id":"A17222309452323464","version":"1.0.1","sign_type":"RSA2","timestamp":"20260222003614"}';
  657. try {
  658. $input = json_decode($input, true);
  659. $result = NotifPay::makeNotify('xty_pay', $input);
  660. if ($result['result'] == "success") {
  661. $signData = json_decode($input["req_data"], true);
  662. if ((new PayNotifyService())->updateOrderCoin($signData['out_trade_no'], formatFenToYuan($signData['total_amount']), $signData['order_no'] ?? '') == true) {
  663. $result['result'] = NotifPay::makeReturnNotify('xty_pay', 'success');
  664. } else {
  665. $result['result'] = NotifPay::makeReturnNotify('xty_pay', 'fail') . ': 订单号不存在或金额有误!';
  666. }
  667. }
  668. echo $result['result'];
  669. } catch (\Exception $e) {
  670. echo "fail: 支付回调异常:" . $e->getMessage(). $e->getFile().":".$e->getLine();
  671. }
  672. exit();
  673. }
  674. }