Pay.php 67 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737
  1. <?php
  2. namespace app\api\controller\v1;
  3. use app\api\services\AliPayServices;
  4. use app\api\services\ThirdPayServices;
  5. use app\api\services\WxPayServices;
  6. use app\common\model\ShopGoodsModel;
  7. use app\common\model\ShopOrderGoodsModel as OrderGoods;
  8. use app\common\model\ShopOrderModel;
  9. use app\common\model\UserModel;
  10. use app\common\service\PaymentService;
  11. use app\common\service\SystemConfigService;
  12. use app\common\service\UserBankSignService;
  13. use app\common\service\YsBankService;
  14. use app\model\UserDataModel;
  15. use app\model\VipOrderModel;
  16. use app\Request;
  17. use app\services\balancePayServices;
  18. use app\services\OfflinePayServices;
  19. use jobs\VipOrderJob;
  20. use think\Exception;
  21. use think\facade\Db;
  22. use utils\RedisCache;
  23. /**
  24. * 支付处理 by wes
  25. * Class Pay
  26. * @package app\api\controller\v1
  27. */
  28. class Pay
  29. {
  30. /**
  31. * 支付方式配置
  32. * @param Request $request
  33. * @return \think\Response
  34. */
  35. public function payconfig(Request $request)
  36. {
  37. $setting = [];
  38. $appresource = $request->post('app_sources', '');
  39. $order_type = $request->post('order_type');
  40. if (empty($order_type)) {
  41. return api_error_return('参数错误');
  42. }
  43. // 石区支付宝支付
  44. array_push($setting, ['is_open' => 1, 'channel' => 22, 'title' => '支付宝支付', 'icon' => getWebUrl() . '/static/img/payconfig/ic_zhifubao.png']);
  45. // 商城购买
  46. if ($order_type == 4) {
  47. if ($appresource == 'android') {
  48. // 石学长 银联支付
  49. array_push($setting, ['is_open' => 1, 'channel' => 15, 'title' => '银联(协议绑卡)', 'icon' => getWebUrl() . '/static/img/payconfig/ic_yinlian_pay.png']);
  50. }
  51. if ($appresource == 'ios') {
  52. // 石学长 银联支付
  53. array_push($setting, ['is_open' => 1, 'channel' => 15, 'title' => '银联', 'icon' => getWebUrl() . '/static/img/payconfig/ic_yinlian_pay.png']);
  54. }
  55. }
  56. // 购买服务商
  57. if ($order_type == 6) {
  58. if ($appresource == 'android') {
  59. // 石学长 银联支付
  60. array_push($setting, ['is_open' => 1, 'channel' => 15, 'title' => '银联(协议绑卡)', 'icon' => getWebUrl() . '/static/img/payconfig/ic_yinlian_pay.png']);
  61. }
  62. if ($appresource == 'ios') {
  63. // 石学长 银联支付
  64. array_push($setting, ['is_open' => 1, 'channel' => 15, 'title' => '银联(协议绑卡)', 'icon' => getWebUrl() . '/static/img/payconfig/ic_yinlian_pay.png']);
  65. }
  66. }
  67. return api_succ_return(['msg' => '成功', 'data' => ['setting' => $setting]]);
  68. }
  69. /**
  70. * 生成支付订单
  71. * @param Request $request
  72. * @return \think\Response
  73. */
  74. public function paymentInfo(Request $request)
  75. {
  76. $post = $request->post();
  77. $curandroid = env('app.CUR_ANDROID_VERSION', '');
  78. $curios = env('app.CUR_IOS_VERSION', '');;
  79. $curAndroidVersion = str_replace('.', '', $curandroid);
  80. $curAndroidVersion = dispRepair($curAndroidVersion, 4, '0', '0');
  81. $curIosVersion = str_replace('.', '', $curios);
  82. $curIosVersion = dispRepair($curIosVersion, 4, '0', '0');
  83. $app_sources = $request->param('app_sources');
  84. $app_version = $request->param('app_version');
  85. $app_version = str_replace('.', '', $app_version);
  86. $app_version = dispRepair($app_version, 4, '0', '0');
  87. if ($app_sources == 'ios') {
  88. if ($curIosVersion > $app_version) {
  89. return api_error_return('app版本号过低,请更新');
  90. }
  91. }
  92. if ($app_sources == 'android') {
  93. if ($curAndroidVersion > $app_version) {
  94. return api_error_return('app版本号过低,请更新');
  95. }
  96. }
  97. if (empty($app_sources) || empty($app_version)) {
  98. if ($curAndroidVersion > $app_version) {
  99. return api_error_return('app版本号过低,请更新');
  100. }
  101. }
  102. // 限制提交调起
  103. $channel = $request->data['channel']; // 支付方式 1 支付宝支付 2 微信支付 3 余额 4 线下
  104. $orderSn = $request->data['order_id'];
  105. $orderType = isset($post['order_type']) ? intval($post['order_type']) : 0;
  106. $cacheKeyLock = "caches:payment:locks:u{$request->uid}_t{$orderType}_{$channel}";
  107. if (RedisCache::get($cacheKeyLock)) {
  108. return api_error_return('您的操作过于频繁,请5秒钟后重试');
  109. }
  110. // 加锁
  111. RedisCache::setnx($cacheKeyLock, 1, rand(2, 3));
  112. try {
  113. // 服务商订单验证
  114. if ($orderType == 6) {
  115. $userInfo = UserModel::where(['id' => $request->uid])->field('id,store_type')->findOrEmpty();
  116. $storeType = isset($userInfo['store_type']) ? $userInfo['store_type'] : 0;
  117. if ($storeType == 1) {
  118. throw new Exception('已是服务商,无需再次开通');
  119. }
  120. }
  121. if (!in_array($channel, [14, 15, 20, 22])) {
  122. throw new Exception('支付类型错误');
  123. }
  124. if ($post['order_type'] == 4) {
  125. if (empty($post['order_id'])) {
  126. throw new Exception('参数错误');
  127. }
  128. // 验证订单是否已支付
  129. if (PaymentService::make()->checkPaymentState($request->uid, $orderSn)) {
  130. throw new Exception('订单或已支付');
  131. }
  132. // 订单状态验证
  133. if (!ShopOrderModel::where(['order_sn' => $post['order_id'], 'status' => 0])->value('order_id')) {
  134. throw new Exception('订单不存在或已支付');
  135. }
  136. // 两小时内同一个订单调起未支付数量限制
  137. $limitPayCount = SystemConfigService::make()->getConfigByName('trade_call_pay_limit', 1, 'tradeconfig');
  138. $limitPayCount = $limitPayCount ? $limitPayCount : env('PAYMENT.UNPAY_LIMIT_NUM', 5);
  139. $count = PaymentService::make()->getPaymentCountByState($request->uid, $orderSn, 4, 7, 2);
  140. if ($count >= $limitPayCount) {
  141. throw new Exception("2小时内该笔订单请求支付已超过{$limitPayCount}次,请稍后再试");
  142. }
  143. }
  144. // 支付通道处理
  145. switch ($channel) {
  146. case 1:
  147. // 微信支付
  148. $result = WxPayServices::instance()->userId($request->uid)->data($request->data)->getUnifiedOrder();
  149. break;
  150. case 2:
  151. // 支付宝支付
  152. $result = AliPayServices::instance()->uid($request->uid)->data($request->data)->getUnifiedOrder();
  153. break;
  154. case 3:
  155. // 余额支付
  156. getActionSecury($request->uid, $request->post('security_pass', ''));
  157. $ser = new \app\api\services\BalancePayServices();
  158. $ser->balanceToOrder($request->uid, $request->post('order_id', ''));
  159. $result = api_succ_return(['msg' => '余额支付调用成功', 'data' => []]);
  160. break;
  161. case 14:
  162. // 第三方支付 汇付支付支付
  163. {
  164. $pay = new ThirdPayServices();
  165. $result = $pay->getHfPayInfoHF($request->uid, $request->data);
  166. }
  167. break;
  168. case 15:
  169. // 第三方支付 石区长
  170. {
  171. $pay = new ThirdPayServices();
  172. $result = $pay->getPayInfoSQZ($request->uid, $request->data);
  173. }
  174. break;
  175. case 16:
  176. // 第三方支付 支付宝 石区长
  177. {
  178. $pay = new ThirdPayServices();
  179. $result = $pay->getPayInfoSQZAlipay($request->uid, $request->data);
  180. }
  181. break;
  182. case 17:
  183. // 第三方支付 微信 石区长
  184. {
  185. $pay = new ThirdPayServices();
  186. $result = $pay->getPayInfoSQZWechat($request->uid, $request->data);
  187. }
  188. break;
  189. case 18:
  190. // 第三方支付 银联快捷 石区长 首信易
  191. {
  192. $pay = new ThirdPayServices();
  193. $result = $pay->getPayInfoSQZBankkuai($request->uid, $request->data);
  194. }
  195. break;
  196. case 19:
  197. // 第三方支付 usdt充值
  198. {
  199. $pay = new ThirdPayServices();
  200. $result = $pay->getPayInfoUsdt($request->uid, $request->data);
  201. }
  202. break;
  203. case 20:
  204. // 直连银盛 无卡快捷
  205. {
  206. $pay = new ThirdPayServices();
  207. $result = $pay->getPayInfoYSwk($request->uid, $request->data);
  208. }
  209. break;
  210. case 22:
  211. // 支付宝 电科科技支付
  212. {
  213. $pay = new ThirdPayServices();
  214. $result = $pay->getPayInfoDiankeZfb($request->uid, $request->data);
  215. }
  216. break;
  217. case 56:
  218. // 第三方支付 易票联统一支付
  219. {
  220. $pay = new ThirdPayServices();
  221. $result = $pay->getYsfPayInfoTY($request->uid, $request->data);
  222. }
  223. break;
  224. }
  225. } catch (Exception $e) {
  226. RedisCache::clear($cacheKeyLock);
  227. return api_error_return($e->getMessage());
  228. }
  229. RedisCache::keyDel("caches:paymentCall:u{$request->uid}_ot{$orderType}*");
  230. return $result;
  231. }
  232. /**
  233. * 石学长 银联支付
  234. * @param Request $request
  235. * @return \think\Response
  236. */
  237. public function sylSurePay(Request $request)
  238. {
  239. Db::startTrans();
  240. try {
  241. $third_pay = new ThirdPayServices();
  242. $third_pay->sylSurePay($request->uid, $request->post());
  243. Db::commit();
  244. } catch (\Exception $e) {
  245. Db::rollback();
  246. return api_error_return($e->getMessage());
  247. }
  248. return api_succ_return('支付订单提交成功,稍后请关注订单列表');
  249. }
  250. /**
  251. * 银盛快捷确认支付
  252. * @param Request $request
  253. * @return \think\Response
  254. */
  255. public function zlysSurePay(Request $request)
  256. {
  257. $post = $request->post();
  258. if (empty($post['trade_no']) || empty($post['sms_code'])) {
  259. return api_error_return('参数错误');
  260. }
  261. Db::startTrans();
  262. try {
  263. $ser = new ThirdPayServices();
  264. $res = $ser->kjPayWithCode($post['trade_no'], $post['sms_code']);
  265. Db::commit();
  266. } catch (\Exception $e) {
  267. Db::rollback();
  268. return api_error_return($e->getMessage());
  269. }
  270. return $res;
  271. }
  272. /**
  273. * 直连银盛 支持的银行卡列表
  274. * @param Request $request
  275. * @return \think\Response
  276. * @throws \think\db\exception\DataNotFoundException
  277. * @throws \think\db\exception\DbException
  278. * @throws \think\db\exception\ModelNotFoundException
  279. */
  280. public function zlysBankList(Request $request)
  281. {
  282. try {
  283. $post = $request->post();
  284. $pageSize = isset($post['limit']) ? $post['limit'] : 0;
  285. return api_succ_return(['msg' => '成功', 'data' => YsBankService::make()->getList($post, $pageSize)]);
  286. } catch (\Exception $exception) {
  287. return api_error_return('获取错误:' . $exception->getMessage());
  288. }
  289. }
  290. /**
  291. * 银盛银行卡支付支持的银行通道
  292. * @param Request $request
  293. * @return \think\Response
  294. */
  295. public function zlysBankPayWay(Request $request)
  296. {
  297. return api_succ_return(['msg' => '成功', 'data' => [
  298. ['bank_name' => '工商银行', 'xiane' => '单笔1万、单日1万、单月5万', 'jieji' => '是', 'xinyong' => '是'],
  299. ['bank_name' => '中国银行', 'xiane' => '单笔5万,单日5万', 'jieji' => '否', 'xinyong' => '是'],
  300. ['bank_name' => '建设银行', 'xiane' => '单笔1万、单日1万、单月5万', 'jieji' => '是', 'xinyong' => '是'],
  301. ['bank_name' => '招商银行', 'xiane' => '单笔5万,单日5万', 'jieji' => '否', 'xinyong' => '是'],
  302. ['bank_name' => '光大银行', 'xiane' => '单笔0.5万、单日5万 ', 'jieji' => '是', 'xinyong' => '是'],
  303. ['bank_name' => '民生银行', 'xiane' => '2万/2万', 'jieji' => '是', 'xinyong' => '是'],
  304. ['bank_name' => '浦发银行', 'xiane' => '借单笔/日2万、贷单笔/日1万、月不限', 'jieji' => '是', 'xinyong' => '是'],
  305. ['bank_name' => '平安银行', 'xiane' => '单笔5万、单日5万、月不限', 'jieji' => '是', 'xinyong' => '否'],
  306. ['bank_name' => '广发银行', 'xiane' => '贷记卡(单笔3w,单日3w)、借记卡(单笔2w,单日2w)', 'jieji' => '是', 'xinyong' => '是'],
  307. ['bank_name' => '中信银行', 'xiane' => '单笔5万、日/月不限', 'jieji' => '是', 'xinyong' => '是'],
  308. ['bank_name' => '交通银行', 'xiane' => '单笔2万,单日2万,单月5万', 'jieji' => '否', 'xinyong' => '是'],
  309. ['bank_name' => '渤海银行', 'xiane' => '借单笔3w,单日3w;贷单笔2w,单日2w', 'jieji' => '是', 'xinyong' => '是'],
  310. ['bank_name' => '上海银行', 'xiane' => '借单笔1w单日1万;贷单笔2w,日不限', 'jieji' => '是', 'xinyong' => '是'],
  311. ['bank_name' => '华夏银行', 'xiane' => '日累计2万,月累计60万', 'jieji' => '是', 'xinyong' => '否'],
  312. ['bank_name' => '邮储银行', 'xiane' => '借记卡:无限额,以发卡测为准;贷记卡:单笔2万、单日2万', 'jieji' => '是', 'xinyong' => '是'],
  313. ['bank_name' => '浙商银行', 'xiane' => '单笔2万、单日2万', 'jieji' => '是', 'xinyong' => '是'],
  314. ['bank_name' => '区域银行', 'xiane' => '无', 'jieji' => '是', 'xinyong' => '是']]
  315. ]);
  316. }
  317. /**
  318. * 用户绑定银行卡
  319. * @param Request $request
  320. * @return \think\Response
  321. */
  322. public function userToSignBank(Request $request)
  323. {
  324. Db::startTrans();
  325. try {
  326. $third_pay = new ThirdPayServices();
  327. $sign_url = $third_pay->userBankSign($request->uid, $request->post());
  328. Db::commit();
  329. } catch (\Exception $e) {
  330. Db::rollback();
  331. return api_error_return($e->getMessage());
  332. }
  333. return api_succ_return(['msg' => '成功', 'data' => ['sign_url' => $sign_url]]);
  334. }
  335. /**
  336. * 用户解绑银行卡
  337. * @param Request $request
  338. * @return \think\Response
  339. */
  340. public function userToUnSignBank(Request $request)
  341. {
  342. Db::startTrans();
  343. try {
  344. $third_pay = new ThirdPayServices();
  345. $third_pay->userUnBankSign($request->uid, $request->post());
  346. Db::commit();
  347. } catch (\Exception $e) {
  348. Db::rollback();
  349. return api_error_return($e->getMessage());
  350. }
  351. return api_succ_return('成功');
  352. }
  353. /**
  354. * 用户绑定银行卡签名
  355. * @param Request $request
  356. * @return \think\Response
  357. * @throws \think\db\exception\DataNotFoundException
  358. * @throws \think\db\exception\DbException
  359. * @throws \think\db\exception\ModelNotFoundException
  360. */
  361. public function myBankSignList(Request $request)
  362. {
  363. $list = Db::name('user_bank_sign')->where('uid', $request->uid)
  364. ->where('status', 2)
  365. ->field('id,name,bank_card,phone')
  366. ->withAttr('bank_card', function ($val, $data) {
  367. $len = strlen($val);
  368. return substr($val, 0, 4) . '****' . substr($val, $len - 5, $len - 1);
  369. })->select()->toArray();
  370. return api_succ_return(['msg' => '成功', 'data' => $list]);
  371. }
  372. /**
  373. * 支持的银行卡
  374. * @param Request $request
  375. * @return \think\Response
  376. */
  377. public function ylBindCanSignList(Request $request)
  378. {
  379. return api_succ_return(['msg' => '成功', 'data' => [
  380. 'chuxuka' => ['中国银行', '建设银行', '工商银行', '浦发银行', '光大银行', '华夏银行', '民生银行', '平安银行', '上海银行', '交通银行', '邮政储蓄银行', '中信银行', '浙商银行', '广东省农村信用社', '山西省农村信用社', '内蒙古自治区农村信用社', '吉林农村信用社', '河南省农村信用社', '黄河农村商业银行', '深圳农村商业银行', '天津滨海农村商业银行股份有限公司', '大连农村商业银行', '鄞州银行', '天津农商银行', '辽宁省农村信用社', '湖北农信', '云南省农村信用社联合社', '陕西省农村信用社', '青海省农村信用社联合社', '湖南省农村信用社', '黑龙江省农村信用社', '广西农村信用社', '苏州银行', '四川省农村信用社', '甘肃省农村信用社', '山东省农村信用社联合社', '广西北部湾银行', '抚顺银行股份有限公司', '辽阳银行股份有限公司', '贵州银行', '晋中银行股份有限公司', '西藏银行股份有限公司', '新疆汇和银行股份有限公司', '江苏江阴农村商业银行股份有限公司', '大连银行', '阜新银行', '吉林银行', '宁夏银行', '嘉兴银行', '常熟农商银行', '江苏江南农村商业银行股份公司', '江苏长江商行', '台州银行', '温州银行', '浙江稠州商业银行', '绍兴银行', '宁波通商银行股份有限公司', '温州民商银行', '浙江民泰商业银行', '浙江泰隆商业银行', '金华银行股份有限公司', '南洋商业银行', '贵阳银行', '韩亚银行', '宜宾商业银行', '自贡市商业银行', '顺德农村商业银行', '桂林银行股份有限公司', '承德银行', '富滇银行', '昆仑银行', '新韩银行中国', '邢台银行', '张家口市商业银行', '沧州银行', '兰州银行', '友利银行', '焦作中旅银行', '泉州银行', '厦门国际银行', '营口银行', '朝阳银行股份有限公司', '广东华兴银行', '长沙银行', '锦州银行', '九江银行', '石嘴山银行股份有限公司', '哈尔滨银行', '龙江银行', '江西银行', '攀枝花市商业银行', '重庆三峡银行', '广州银行', '晋城银行', '上饶银行', '赣州银行', '长城华西银行', '盛京银行', '甘肃银行', '中原银行', '湖北银行', '郑州银行', '富邦华一银行有限公司', '星展银行', '乐山市商业银行股份有限公司', '长治银行', '上海华瑞银行', '湖南三湘银行', '海南银行', '福建海峡银行', '北京农商银行', '河北省农村信用社', '上海农村商业银行', '江苏省农村信用社联合社', '浙江农信', '安徽省农村信用社联合社', '福建省农村信用社联合社', '江西省农村信用社', '海南省农村信用社', '重庆农村商业银行', '贵州省农村信用社', '新疆自治区农村信用社', '武汉农村商业银行', '成都农商银行', '张家港农村商业银行', '江苏紫金农村商业银行', '无锡农村商业银行', '太仓农村商业银行', '昆山农村商业银行', '广东南海农村商业银行', '浙江长兴农村商业银行'],
  381. 'xinyongka' => ['招商银行', '中国银行', '中信银行', '民生银行', '浦发银行', '平安银行', '光大银行', '广东发展银行', '上海银行', '华夏银行', '工商银行', '建设银行', '交通银行', '邮政储蓄银行', '浙商银行', '北京银行']
  382. ]]);
  383. }
  384. /**
  385. * 绑定支付宝账号
  386. * @param Request $request
  387. * @param UserDataModel $model
  388. * @return \think\Response
  389. */
  390. public function bindAlipay(Request $request, UserDataModel $model)
  391. {
  392. $re_data = $request->data;
  393. if (isset($re_data['real_name']) || isset($re_data['alipay'])) {
  394. return api_error_return('参数错误--算出sign_str不要传real_name跟alipay');
  395. }
  396. [$sign_str] = $request->getMore([
  397. ['sign_str', '']
  398. ], true);
  399. if (empty($sign_str))
  400. return api_error_return('参数错误');
  401. $data = json_decode(AESjiemi($sign_str));
  402. if (empty($data))
  403. return api_error_return('参数错误');
  404. $data = object_array($data);
  405. try {
  406. return api_succ_return(['msg' => '绑定成功', 'data' => $model->bindAlipay($data, $request->uid)]);
  407. } catch (\Exception $e) {
  408. return api_error_return('绑定失败');
  409. }
  410. }
  411. /**
  412. * 解绑支付宝
  413. * @param Request $request
  414. * @param UserDataModel $model
  415. * @return \think\Response
  416. */
  417. public function unbindAlipay(Request $request, UserDataModel $model)
  418. {
  419. try {
  420. return api_succ_return(['msg' => '解绑成功', 'data' => $model->unbindAlipay($request)]);
  421. } catch (\Exception $e) {
  422. return api_error_return('解绑失败');
  423. }
  424. }
  425. /************** 支付回调处理 **************/
  426. /**
  427. * 电科支付回调处理
  428. * @param Request $request
  429. * @return string
  430. */
  431. public function thirdPayZfbNewBack(Request $request)
  432. {
  433. $params = $request->param();
  434. $service = new ThirdPayServices();
  435. $date = date('Y-m-d H:i:s');
  436. $outTradeNo = isset($params['orderId'])? trim($params['orderId']) : '';
  437. $isPay = isset($params['pay'])? trim($params['pay']) : '';
  438. $amount = isset($params['amount'])? floatval($params['amount']) : 0;
  439. $paySign = isset($params['sign'])? trim($params['sign']) : '';
  440. if(empty($paySign)){
  441. unset($params['sign']);
  442. return $service->diankesign($params);
  443. }
  444. // 加锁
  445. $key = $outTradeNo? $outTradeNo : date('YmdHis');
  446. $cacheKeyLock = "caches:payNotify:dkpay:locks:otn_{$key}";
  447. $cacheKey = "caches:payNotify:dkpay:otn_{$key}:";
  448. if(RedisCache::get($cacheKeyLock)){
  449. return 'Frequent submission';
  450. }
  451. // 回调处理
  452. RedisCache::setnx($cacheKeyLock, 1, rand(2,3));
  453. RedisCache::set($cacheKey.'callback', ['params'=> $params,'date'=> $date], 7200);
  454. if ($outTradeNo && $amount && $isPay == 'true') {
  455. // 校验签名
  456. if ($paySign) {
  457. $signData = $params;
  458. unset($signData['sign']);
  459. $sign = $service->diankesign($signData);
  460. if ($sign == $paySign) {
  461. Db::startTrans();
  462. try {
  463. PaymentService::make()->payBack($params['orderId'], $params['amount'], 22, json_encode($params));
  464. Db::commit();
  465. return 'success';
  466. } catch (\Exception $e) {
  467. Db::rollback();
  468. $error = [
  469. 'msg'=> $e->getMessage(),
  470. 'trace'=> $e->getTrace(),
  471. ];
  472. RedisCache::set($cacheKey.'fail', ['params'=> $params,'error'=> $error,'date'=> $date], 7200);
  473. RedisCache::clear($cacheKeyLock);
  474. }
  475. } else {
  476. RedisCache::set($cacheKey.'error', ['params'=> $params,'error'=>'签名错误','date'=> $date], 7200);
  477. }
  478. }else{
  479. RedisCache::set($cacheKey.'error', ['params'=> $params,'error'=>'缺少签名参数','date'=> $date], 7200);
  480. }
  481. }
  482. return 'fail';
  483. }
  484. /**
  485. * 支付宝支付回调
  486. * @param Request $request
  487. * @return mixed
  488. */
  489. public function aliResult(Request $request)
  490. {
  491. $data = $request->param();
  492. $key = isset($data['out_trade_no']) ? $data['out_trade_no'] : date("YmdHis");
  493. $cacheKey = "caches:payNotify:alipay:otn_{$key}:";
  494. RedisCache::set($cacheKey."callback", ['params'=>$data,'date'=>'Y-m-d H:i:s'], 7200);
  495. if(empty($data)){
  496. return 'fail:params error';
  497. }
  498. try{
  499. return AliPayServices::instance()->data($data)->getNotifyInfo()->afterPay(2);
  500. } catch (\Exception $exception){
  501. RedisCache::set($cacheKey.'error', ['params'=>$data,'error'=> ['msg'=> $exception->getMessage(),'trace'=>$exception->getTrace()],'date'=>'Y-m-d H:i:s'], 7200);
  502. return 'fail';
  503. }
  504. }
  505. /**
  506. * 微信支付回调
  507. * @param Request $request
  508. * @return mixed
  509. */
  510. public function wxResult(Request $request)
  511. {
  512. $data['body'] = file_get_contents('php://input');
  513. $data['header'] = $request->header();
  514. $key = isset($data['body']['out_trade_no']) ? $data['body']['out_trade_no'] : date("YmdHis");
  515. $cacheKey = "caches:payNotify:wxpay:otn_{$key}:";
  516. RedisCache::set($cacheKey."callback", ['params'=>$data,'date'=>'Y-m-d H:i:s'], 7200);
  517. if(empty($data['body'])){
  518. return 'fail:params error';
  519. }
  520. try{
  521. return \app\api\services\WxPayServices::instance()->data($data)->getNotifyInfo()->afterPay(1);
  522. } catch (\Exception $exception){
  523. RedisCache::set($cacheKey.'error', ['params'=>$data,'error'=> ['msg'=> $exception->getMessage(),'trace'=>$exception->getTrace()],'date'=>'Y-m-d H:i:s'], 7200);
  524. return 'fail';
  525. }
  526. }
  527. /**
  528. *
  529. * thirdPaySqzBack支付三方sqz回调
  530. * @param Request $request
  531. * @return string
  532. */
  533. public function thirdPaySqzBack(Request $request)
  534. {
  535. $params = $request->param();
  536. $date = date('Y-m-d H:i:s');
  537. $service = new ThirdPayServices();
  538. $outTradeNo = isset($params['orderid'])? trim($params['orderid']) : '';
  539. $isPay = isset($params['opstate'])? trim($params['opstate']) : '-1';
  540. $amount = isset($params['ovalue'])? floatval($params['ovalue']) : 0;
  541. $paySign = isset($params['sign'])? trim($params['sign']) : '';
  542. if(empty($paySign)){
  543. return $service->sqzSign($params);
  544. }
  545. // 加锁
  546. $key = $outTradeNo? $outTradeNo : date('YmdHis');
  547. $cacheKeyLock = "caches:payNotify:sqzpay:locks:otn_{$key}";
  548. $cacheKey = "caches:payNotify:sqzpay:otn_{$key}:";
  549. if(RedisCache::get($cacheKeyLock)){
  550. return 'Frequent submission';
  551. }
  552. // 回调处理
  553. RedisCache::setnx($cacheKeyLock, 1, rand(2,3));
  554. RedisCache::set($cacheKey.'callback', ['params'=> $params,'date'=> $date], 7200);
  555. if ($outTradeNo && $isPay>=0 && $amount>0) {
  556. // 校验签名
  557. if ($paySign) {
  558. $sign = $service->sqzSign($params);
  559. if ($sign === $paySign) {
  560. if ($isPay == 0) {
  561. Db::startTrans();
  562. try {
  563. PaymentService::make()->payBack($outTradeNo, $amount, 15, json_encode($params));
  564. Db::commit();
  565. } catch (\Exception $e) {
  566. Db::rollback();
  567. $error = [
  568. 'msg'=> $e->getMessage(),
  569. 'trace'=> $e->getTrace(),
  570. ];
  571. RedisCache::set($cacheKey.'fail', ['params'=> $params,'error'=> $error,'date'=> $date], 7200);
  572. RedisCache::clear($cacheKeyLock);
  573. return 'opstate=0' . $e->getMessage();
  574. }
  575. } else {
  576. RedisCache::set($cacheKey.'error', ['params'=> $params,'error'=>'订单未支付','date'=> $date], 7200);
  577. return 'opstate=01';
  578. }
  579. } else {
  580. RedisCache::set($cacheKey.'error', ['params'=> $params,'error'=>'协议绑卡签名错误','date'=> $date], 7200);
  581. return 'opstate=0';
  582. }
  583. }
  584. }else{
  585. RedisCache::set($cacheKey.'error', ['params'=> $params,'error'=>'回调参数错误','date'=> $date], 7200);
  586. }
  587. return 'opstate=0';
  588. }
  589. /**
  590. * 三方支付宝sqz回调
  591. * @param Request $request
  592. * @return string
  593. */
  594. public function thirdPaySqzAliBack(Request $request)
  595. {
  596. $params = $request->param();
  597. if (isset($params['orderid']) && isset($params['opstate']) && isset($params['ovalue'])) {
  598. // 校验签名
  599. if (isset($params['sign'])) {
  600. $sign = md5('orderid=' . $params['orderid'] . '&opstate=' . $params['opstate'] . '&ovalue=' . $params['ovalue'] . env('PAYSQZ.SIGNKEY'));
  601. if ($sign === $params['sign']) {
  602. if ($params['opstate'] == 0) {
  603. Db::startTrans();
  604. try {
  605. $service = new ThirdPayServices();
  606. $service->payBack($params['orderid'], $params['ovalue'], 16, json_encode($params));
  607. Db::commit();
  608. return 'success';
  609. } catch (\Exception $e) {
  610. Db::rollback();
  611. sr_log($e->getMessage());
  612. return 'opstate=0' . $e->getMessage();
  613. }
  614. } else {
  615. return 'opstate=01';
  616. }
  617. } else {
  618. return 'opstate=0';
  619. }
  620. }
  621. }
  622. return 'opstate=0';
  623. }
  624. /**
  625. * 支付宝支付回调 多来贝
  626. * @param Request $request
  627. * @return mixed
  628. */
  629. public function aliResultDLB(Request $request)
  630. {
  631. sr_log('----------------------支付三方回调-------------------------');
  632. sr_log($request);
  633. sr_log($request->param());
  634. sr_log('----------------------支付三方回调-------------------------');
  635. // DLB1649854201945040279940469OP
  636. $result = [
  637. 'order_id' => 'DLB1649854201945040279940469OP'
  638. ];
  639. $pay_info = Db::name('payment')->where('out_trade_no', $result['order_id'])->find();
  640. if (!$pay_info) {
  641. echo 'success';
  642. die();
  643. } else {
  644. if ($pay_info['state'] != 7) {
  645. echo 'success';
  646. die();
  647. }
  648. Db::startTrans();
  649. try {
  650. Db::name('payment')->where('id', $pay_info['id'])->update(['state' => 6, 'pay_at' => date('Y-m-d H:i:s')]); // 更改订单状态
  651. switch ($pay_info['order_type']) {
  652. case 1: // 充值
  653. break;
  654. case 3:
  655. // 充值会员
  656. //
  657. break;
  658. case 4: //购买商品
  659. // $order = Order::where(['order_sn' => explode(',', $pay_info['remarks'])])->select()->toArray();
  660. // Order::payDoneOrderCallback($order, 3, $pay_info['uid']);
  661. $m_goods = new ShopGoodsModel();
  662. $m_user = new UserModel();
  663. $m_shoporder = new ShopOrderModel();
  664. // 更改订单状态
  665. $order = ShopOrderModel::where('order_sn', $pay_info['remarks'])->find();
  666. $nowTime = date('Y-m-d H:i:s', time());
  667. Db::name('shop_order')->where(['order_sn' => $pay_info['remarks']])
  668. ->update(['pay_type' => 2, 'status' => 1, 'updated_time' => $nowTime]);
  669. // 增加销量
  670. $orderGoods = OrderGoods::where(['order_id' => $order['order_id']])->select()->toArray();
  671. foreach ($orderGoods as $k => $v) {
  672. ShopGoodsModel::where(['goods_id' => $v['goods_id']])->inc('sales_volume', $v['num'])->inc('real_sales_volume', $v['num'])->update();
  673. }
  674. // 送积分
  675. edit_user_score(5, $order['user_id'], $order['rebate_score']);
  676. edit_user_redscore(1, $order['user_id'], $order['rebate_lock_score']);
  677. break;
  678. }
  679. Db::commit();
  680. echo 'success';
  681. die;
  682. } catch (\Exception $e) {
  683. Db::rollback();
  684. echo 'failure';
  685. die;
  686. }
  687. }
  688. echo 'success';
  689. die();
  690. }
  691. /**
  692. * 微信支付回调 多来贝
  693. * @param Request $request
  694. * @return mixed
  695. */
  696. public function wechatResultDLB(Request $request)
  697. {
  698. sr_log('----------------------支付三方回调-------------------------');
  699. sr_log(json_encode($request->param()));
  700. sr_log('----------------------支付三方回调-------------------------');
  701. $result = $request->param();
  702. try {
  703. if (!$result || !$result['sign']) {
  704. sr_log('11111');
  705. echo 'success';
  706. die();
  707. }
  708. $sign = thirdPayGetSign($result, '897d9ea909093173b24dd89c772181e4');
  709. if ($result['sign'] != $sign) {
  710. sr_log('222222');
  711. echo 'success';
  712. die();
  713. }
  714. if ($result['status'] != 1) {
  715. sr_log('33333333');
  716. echo 'success';
  717. die();
  718. }
  719. } catch (Exception $e) {
  720. echo 'success';
  721. sr_log('aaa' . $e->getMessage());
  722. die();
  723. }
  724. $pay_info = Db::name('payment')->where('out_trade_no', $result['order_no'])->find();
  725. if (!$pay_info) {
  726. sr_log('333333333');
  727. echo 'success';
  728. die();
  729. } else {
  730. if ($pay_info['state'] != 7) {
  731. sr_log('8888' . '已经处理过了');
  732. echo 'success';
  733. die();
  734. }
  735. if ($result['total_amount'] < $pay_info['total_fee']) {
  736. sr_testDb(json_encode($pay_info), 1);
  737. sr_log('9999' . '支付金额错误');
  738. echo 'success';
  739. die();
  740. }
  741. Db::startTrans();
  742. try {
  743. Db::name('payment')->where('id', $pay_info['id'])->update(['state' => 6, 'pay_at' => date('Y-m-d H:i:s')]); // 更改订单状态
  744. switch ($pay_info['order_type']) {
  745. case 1: // 充值
  746. break;
  747. case 3:
  748. // 充值会员
  749. break;
  750. case 4: //购买商品
  751. // 更改订单状态
  752. $order = ShopOrderModel::where('order_sn', $pay_info['remarks'])->find();
  753. $nowTime = date('Y-m-d H:i:s', time());
  754. Db::name('shop_order')->where(['order_sn' => $pay_info['remarks']])
  755. ->update(['pay_type' => 2, 'status' => 1, 'updated_time' => $nowTime]);
  756. // 增加销量
  757. $orderGoods = OrderGoods::where(['order_id' => $order['order_id']])->select()->toArray();
  758. foreach ($orderGoods as $k => $v) {
  759. ShopGoodsModel::where(['goods_id' => $v['goods_id']])->inc('sales_volume', $v['num'])->inc('real_sales_volume', $v['num'])->update();
  760. }
  761. // 送积分
  762. edit_user_score(5, $order['user_id'], $order['rebate_score']);
  763. edit_user_redscore(1, $order['user_id'], $order['rebate_lock_score']);
  764. break;
  765. }
  766. Db::commit();
  767. echo 'success';
  768. die;
  769. } catch (\Exception $e) {
  770. Db::rollback();
  771. echo 'failure';
  772. sr_log('微信多乐宝报错:' . $e->getMessage());
  773. die;
  774. }
  775. }
  776. echo 'success';
  777. die();
  778. }
  779. /**
  780. * 微信支付回调 畅联
  781. * @param Request $request
  782. * @return mixed
  783. */
  784. public function wechatResultCL(Request $request)
  785. {
  786. sr_log('----------------------支付三方回调-------------------------');
  787. sr_log(json_encode($request->param()));
  788. sr_log('----------------------支付三方回调-------------------------');
  789. $result = $request->param();
  790. try {
  791. if (!$result || !$result['sign']) {
  792. sr_log('cl11111');
  793. echo 'success';
  794. die();
  795. }
  796. $sign = thirdPayCheckSignCL($result, 'XMLfjHMPOGexsSaadIWSVCNG0XJBClZZ');
  797. if ($result['sign'] != $sign) {
  798. sr_log('cl222222');
  799. echo 'success';
  800. die();
  801. }
  802. if ($result['callbacks'] != 'CODE_SUCCESS') {
  803. sr_log('cl33333333');
  804. echo 'success';
  805. die();
  806. }
  807. } catch (Exception $e) {
  808. echo 'success';
  809. sr_log('claaa' . $e->getMessage());
  810. die();
  811. }
  812. $pay_info = Db::name('payment')->where('out_trade_no', $result['out_trade_no'])->find();
  813. if (!$pay_info) {
  814. sr_log('cl333333333');
  815. echo 'success';
  816. die();
  817. } else {
  818. if ($pay_info['state'] != 7) {
  819. sr_log('cl8888' . '已经处理过了');
  820. echo 'success';
  821. die();
  822. }
  823. if ($result['amount'] < $pay_info['total_fee']) {
  824. sr_testDb(json_encode($pay_info), 1);
  825. sr_log('cl9999' . '支付金额错误');
  826. echo 'success';
  827. die();
  828. }
  829. Db::startTrans();
  830. try {
  831. $pay_info = Db::name('payment')->where('out_trade_no', $result['out_trade_no'])->lock(true)->find();
  832. Db::name("thirdpay_back")->insert([
  833. 'out_order_no' => $result['out_trade_no'],
  834. 'content' => json_encode($result),
  835. 'create_time' => sr_getcurtime(time()),
  836. 'type' => 1,
  837. 'uid' => $pay_info['uid']
  838. ]);
  839. if (empty($pay_info)) {
  840. throw new Exception('畅联并发了');
  841. }
  842. Db::name('payment')->where('id', $pay_info['id'])->update(['state' => 6, 'pay_at' => date('Y-m-d H:i:s')]); // 更改订单状态
  843. switch ($pay_info['order_type']) {
  844. case 1: // 充值
  845. break;
  846. case 3:
  847. // 充值会员
  848. break;
  849. case 4: //购买商品
  850. $m_user = new UserModel();
  851. // 更改订单状态
  852. $order = ShopOrderModel::where('order_sn', $pay_info['remarks'])->find();
  853. $nowTime = date('Y-m-d H:i:s', time());
  854. Db::name('shop_order')->where(['order_sn' => $pay_info['remarks']])
  855. ->update(['status' => 1, 'pay_type' => 7, 'updated_time' => $nowTime]);
  856. // 增加销量
  857. $orderGoods = OrderGoods::where(['order_id' => $order['order_id']])->select()->toArray();
  858. foreach ($orderGoods as $k => $v) {
  859. ShopGoodsModel::where(['goods_id' => $v['goods_id']])->inc('sales_volume', $v['num'])->inc('real_sales_volume', $v['num'])->update();
  860. }
  861. // 送积分
  862. edit_user_score(5, $order['user_id'], $order['rebate_score']);
  863. edit_user_redscore(1, $order['user_id'], $order['rebate_lock_score']);
  864. break;
  865. }
  866. Db::commit();
  867. } catch (\Exception $e) {
  868. Db::rollback();
  869. sr_log('cl微信报错:' . $e->getMessage());
  870. echo 'failure';
  871. die;
  872. }
  873. echo 'success';
  874. die();
  875. }
  876. echo 'success';
  877. die();
  878. }
  879. /**
  880. * 支付宝支付回调 畅联
  881. * @param Request $request
  882. * @return mixed
  883. */
  884. public function AliResultCL(Request $request)
  885. {
  886. sr_log('----------------------支付三方回调-------------------------');
  887. sr_log(json_encode($request->param()));
  888. sr_log('----------------------支付三方回调-------------------------');
  889. $result = $request->param();
  890. $pay_info = Db::name('payment')->where('out_trade_no', $result['out_trade_no'])->find();
  891. if (!$pay_info) {
  892. sr_log('cl333333333');
  893. echo 'success';
  894. die();
  895. } else {
  896. if ($pay_info['state'] != 7) {
  897. sr_log('cl8888' . '已经处理过了');
  898. echo 'success';
  899. die();
  900. }
  901. if ($result['amount'] < $pay_info['total_fee']) {
  902. sr_testDb(json_encode($pay_info), 1);
  903. sr_log('cl9999' . '支付金额错误');
  904. echo 'success';
  905. die();
  906. }
  907. $key = 'api' . $request->pathinfo() . $result['out_trade_no'];
  908. Db::startTrans();
  909. try {
  910. redisLock($key);
  911. $pay_info = Db::name('payment')->where('out_trade_no', $result['out_trade_no'])->lock(true)->find();
  912. Db::name("thirdpay_back")->insert([
  913. 'out_order_no' => $result['out_trade_no'],
  914. 'content' => json_encode($result),
  915. 'create_time' => sr_getcurtime(time()),
  916. 'type' => 1,
  917. 'uid' => $pay_info['uid']
  918. ]);
  919. if (empty($pay_info)) {
  920. throw new Exception('畅联支付宝并发了');
  921. }
  922. Db::name('payment')->where('id', $pay_info['id'])->update(['state' => 6, 'pay_at' => date('Y-m-d H:i:s')]); // 更改订单状态
  923. switch ($pay_info['order_type']) {
  924. case 1: // 充值
  925. break;
  926. case 3:
  927. // 充值会员
  928. break;
  929. case 4: //购买商品
  930. $m_user = new UserModel();
  931. // 更改订单状态
  932. $order = ShopOrderModel::where('order_sn', $pay_info['remarks'])->find();
  933. $nowTime = date('Y-m-d H:i:s', time());
  934. Db::name('shop_order')->where(['order_sn' => $pay_info['remarks']])
  935. ->update(['status' => 1, 'pay_type' => 8, 'updated_time' => $nowTime]);
  936. // 增加销量
  937. $orderGoods = OrderGoods::where(['order_id' => $order['order_id']])->select()->toArray();
  938. foreach ($orderGoods as $k => $v) {
  939. ShopGoodsModel::where(['goods_id' => $v['goods_id']])->inc('sales_volume', $v['num'])->inc('real_sales_volume', $v['num'])->update();
  940. }
  941. // 送积分
  942. edit_user_score(5, $order['user_id'], $order['rebate_score']);
  943. edit_user_redscore(1, $order['user_id'], $order['rebate_lock_score']);
  944. break;
  945. }
  946. Db::commit();
  947. } catch (\Exception $e) {
  948. Db::rollback();
  949. if ($e->getCode() != apiPingFanCode()) {
  950. redisFree($key);
  951. }
  952. sr_log('cl支付宝报错:' . $e->getMessage());
  953. echo 'failure';
  954. die;
  955. }
  956. redisFree($key);
  957. echo 'success';
  958. die();
  959. }
  960. echo 'success';
  961. die();
  962. }
  963. /**
  964. * mo宝银联回调 富友
  965. * @param Request $request
  966. * @return mixed
  967. */
  968. public function BankResultFY(Request $request)
  969. {
  970. $res = file_get_contents('php://input');
  971. sr_log('----------------------支付三方富有回调-------------------------');
  972. sr_log($res);
  973. sr_log('----------------------支付三方富有回调-------------------------');
  974. $result = json_decode($res);
  975. if (isset($result->mchnt_cd) && isset($result->message) && isset($result->resp_code) && isset($result->resp_desc)) {
  976. if ($result->resp_code == 0000) {
  977. $res_decode = json_decode(RSA_openssl($result->message, 'decode'));
  978. if (isset($res_decode->order_st) && $res_decode->order_st == 1) {
  979. $out_trade_no = 'FYYL' . $res_decode->order_id;
  980. $pay_info = Db::name('payment')->where('out_trade_no', $out_trade_no)->find();
  981. if ($pay_info) {
  982. if ($pay_info['state'] == 7) {
  983. if ($res_decode->order_amt < bcmul($pay_info['total_fee'], 100, 0)) {
  984. echo 'success';
  985. die();
  986. }
  987. $key = 'api' . $request->pathinfo() . $out_trade_no;
  988. Db::startTrans();
  989. try {
  990. redisLock($key);
  991. $pay_info = Db::name('payment')->where('out_trade_no', $out_trade_no)->lock(true)->find();
  992. Db::name("thirdpay_back")->insert([
  993. 'out_order_no' => $out_trade_no,
  994. 'content' => json_encode($res_decode),
  995. 'create_time' => sr_getcurtime(time()),
  996. 'type' => 2,
  997. 'uid' => $pay_info['uid']
  998. ]);
  999. Db::name('payment')->where('id', $pay_info['id'])->update(['state' => 6, 'pay_at' => date('Y-m-d H:i:s')]); // 更改订单状态
  1000. switch ($pay_info['order_type']) {
  1001. case 1: // 充值
  1002. break;
  1003. case 3:
  1004. // 充值会员
  1005. //
  1006. break;
  1007. case 4: //购买商品
  1008. $m_user = new UserModel();
  1009. // 更改订单状态
  1010. $order = ShopOrderModel::where('order_sn', $pay_info['remarks'])->find();
  1011. $nowTime = date('Y-m-d H:i:s', time());
  1012. Db::name('shop_order')->where(['order_sn' => $pay_info['remarks']])
  1013. ->update(['status' => 1, 'pay_type' => 9, 'updated_time' => $nowTime]);
  1014. // 增加销量
  1015. $orderGoods = OrderGoods::where(['order_id' => $order['order_id']])->select()->toArray();
  1016. foreach ($orderGoods as $k => $v) {
  1017. ShopGoodsModel::where(['goods_id' => $v['goods_id']])->inc('sales_volume', $v['num'])->inc('real_sales_volume', $v['num'])->update();
  1018. }
  1019. $user = $m_user->where('id', $pay_info['uid'])->find();
  1020. // 送积分
  1021. edit_user_score(5, $order['user_id'], $order['rebate_score']);
  1022. edit_user_redscore(1, $order['user_id'], $order['rebate_lock_score']);
  1023. // 释放用户福利积分或者锁定积分到余额
  1024. $sf_money = intval(intval($pay_info['total_fee']) / 100) * 5;
  1025. if ($sf_money > 0) {
  1026. $is_sf = false;
  1027. if ($user['score_away'] > $sf_money && !$is_sf) {
  1028. if ($user['score_away'] <= $sf_money) {
  1029. $sf_money = intval($user['score_away']);
  1030. }
  1031. edit_user_score(24, $pay_info['uid'], $sf_money);
  1032. edit_user_scoreaway(8, $pay_info['uid'], $sf_money);
  1033. $is_sf = true;
  1034. }
  1035. if ($user['score_lock'] > $sf_money && !$is_sf) {
  1036. edit_user_score(25, $pay_info['uid'], $sf_money);
  1037. edit_user_lock_score(2, $pay_info['uid'], $sf_money);
  1038. $is_sf = true;
  1039. }
  1040. }
  1041. break;
  1042. }
  1043. Db::commit();
  1044. } catch (\Exception $e) {
  1045. Db::rollback();
  1046. if ($e->getCode() != apiPingFanCode()) {
  1047. redisFree($key);
  1048. }
  1049. sr_log('fy支付报错:' . $e->getMessage());
  1050. echo 'failure';
  1051. die;
  1052. }
  1053. }
  1054. }
  1055. }
  1056. }
  1057. }
  1058. redisFree($key);
  1059. echo 'success';
  1060. die;
  1061. }
  1062. /**
  1063. * 进件审核回调
  1064. * @param Request $request
  1065. */
  1066. public function yplApplyResult(Request $request)
  1067. {
  1068. $res = file_get_contents('php://input');
  1069. sr_log('----------------------ypl审核回调-------------------------');
  1070. sr_log($res);
  1071. sr_log('----------------------ypl审核回调-------------------------');
  1072. echo "0000";
  1073. die();
  1074. }
  1075. /**
  1076. * @param Request $request
  1077. */
  1078. public function ZfbResultYPL(Request $request)
  1079. {
  1080. $res = file_get_contents('php://input');
  1081. sr_log('----------------------ypl回调-------------------------');
  1082. sr_log($res);
  1083. sr_log('----------------------ypl回调-------------------------');
  1084. $res = json_decode($res, true);
  1085. Db::startTrans();
  1086. try {
  1087. if ($res['payState'] != '00') {
  1088. echo "0000";
  1089. die();
  1090. }
  1091. $pay_info = Db::name('payment')->where('out_trade_no', $res['outTradeNo'])->lock(true)->find();
  1092. Db::name("thirdpay_back")->insert([
  1093. 'out_order_no' => $res['outTradeNo'],
  1094. 'content' => json_encode($res),
  1095. 'create_time' => sr_getcurtime(time()),
  1096. 'type' => 3,
  1097. 'uid' => $pay_info['uid']
  1098. ]);
  1099. Db::name('payment')->where('id', $pay_info['id'])->update(['state' => 6, 'pay_at' => date('Y-m-d H:i:s')]); // 更改订单状态
  1100. switch ($pay_info['order_type']) {
  1101. case 1: // 充值
  1102. break;
  1103. case 3:
  1104. // 充值会员
  1105. break;
  1106. case 4: //购买商品
  1107. $m_user = new UserModel();
  1108. // 更改订单状态
  1109. $order = ShopOrderModel::where('order_sn', $pay_info['remarks'])->find();
  1110. $nowTime = date('Y-m-d H:i:s', time());
  1111. Db::name('shop_order')->where(['order_sn' => $pay_info['remarks']])
  1112. ->update(['status' => 1, 'pay_type' => 8, 'updated_time' => $nowTime]);
  1113. // 增加销量
  1114. $orderGoods = OrderGoods::where(['order_id' => $order['order_id']])->select()->toArray();
  1115. foreach ($orderGoods as $k => $v) {
  1116. ShopGoodsModel::where(['goods_id' => $v['goods_id']])->inc('sales_volume', $v['num'])->inc('real_sales_volume', $v['num'])->update();
  1117. }
  1118. $user = $m_user->where('id', $pay_info['uid'])->find();
  1119. // 送积分
  1120. edit_user_score(5, $order['user_id'], $order['rebate_score']);
  1121. edit_user_redscore(1, $order['user_id'], $order['rebate_lock_score']);
  1122. // 释放用户福利积分或者锁定积分到余额
  1123. $sf_money = intval(intval($pay_info['total_fee']) / 100) * 5;
  1124. if ($sf_money > 0) {
  1125. $is_sf = false;
  1126. if ($user['score_away'] > $sf_money && !$is_sf) {
  1127. if ($user['score_away'] <= $sf_money) {
  1128. $sf_money = intval($user['score_away']);
  1129. }
  1130. edit_user_score(24, $pay_info['uid'], $sf_money);
  1131. edit_user_scoreaway(8, $pay_info['uid'], $sf_money);
  1132. $is_sf = true;
  1133. }
  1134. if ($user['score_lock'] > $sf_money && !$is_sf) {
  1135. edit_user_score(25, $pay_info['uid'], $sf_money);
  1136. edit_user_lock_score(2, $pay_info['uid'], $sf_money);
  1137. $is_sf = true;
  1138. }
  1139. }
  1140. break;
  1141. }
  1142. Db::commit();
  1143. } catch (\Exception $e) {
  1144. Db::rollback();
  1145. sr_log('ypl报错:' . $e->getMessage());
  1146. echo "0000";
  1147. die();
  1148. }
  1149. echo "0000";
  1150. die();
  1151. }
  1152. /**
  1153. * @param Request $request
  1154. * @return \think\Response
  1155. */
  1156. public function ZfbResultHF(Request $request)
  1157. {
  1158. /**
  1159. * 判断支付异步回调业务处理
  1160. * User: shuaishuai.niu
  1161. * Date: 2020/11/16
  1162. * Time: 14:01
  1163. */
  1164. sr_log('----------------------汇付回调-------------------------');
  1165. sr_log($_POST['data']);
  1166. sr_log('----------------------汇付回调-------------------------');
  1167. $params = $_POST['data'];
  1168. # 加载SDK需要的文件
  1169. include_once "../extend/thirdpay/AdapaySdk/init.php";
  1170. # 加载商户的配置文件
  1171. include_once "../extend/thirdpay/config.php";
  1172. $adapay_tools = new \AdaPaySdk\AdapayTools();
  1173. $post_data = json_decode($_POST['data'], 1);
  1174. $post_data_str = json_encode($post_data, JSON_UNESCAPED_UNICODE);
  1175. $post_sign_str = isset($_POST['sign']) ? $_POST['sign'] : '';
  1176. # 先校验签名和返回的数据的签名的数据是否一致
  1177. $sign_flag = $adapay_tools->verifySign($post_data_str, $post_sign_str);
  1178. if ($sign_flag) {
  1179. Db::startTrans();
  1180. try {
  1181. if ($post_data['status'] != 'succeeded') {
  1182. sr_throw('成功1');
  1183. }
  1184. $pay_info = Db::name('payment')->where('out_trade_no', $post_data['order_no'])->lock(true)->find();
  1185. if ($pay_info['state'] != 7) {
  1186. sr_throw('成功1');
  1187. }
  1188. $service = new ThirdPayServices();
  1189. $service->payBack($post_data['order_no'], 0, 14, json_encode($params));
  1190. Db::commit();
  1191. } catch (\Exception $e) {
  1192. Db::rollback();
  1193. sr_log('汇付支付宝回调报错:' . $e->getMessage());
  1194. return api_succ_return('成功2' . $e->getMessage());
  1195. die();
  1196. }
  1197. return api_succ_return('成功');
  1198. die();
  1199. } else {
  1200. sr_log('签名不通过:[' . $post_sign_str . ']' . 'post_data_str--[' . $post_data_str . ']');
  1201. return api_succ_return('成功1');
  1202. die();
  1203. }
  1204. }
  1205. /**
  1206. * 代付回调
  1207. * @param Request $request
  1208. * @return string
  1209. */
  1210. public function thirdPayZfbNewBackdf(Request $request)
  1211. {
  1212. sr_log('----------------------三方支付宝代付电科回调-------------------------1');
  1213. sr_log($request->param());
  1214. sr_log('----------------------三方支付宝代付电科回调-------------------------2');
  1215. $params = $request->param();
  1216. $service = new ThirdPayServices();
  1217. if (isset($params['orderId']) && isset($params['amount'])) {
  1218. // 校验签名
  1219. if (isset($params['sign'])) {
  1220. $back_sign = $params['sign'];
  1221. unset($params['sign']);
  1222. $sign = $service->diankesigndf($params);
  1223. if ($sign == $back_sign) {
  1224. try {
  1225. $service->payDfBack($params['orderId'], $params['amount'], $params, json_encode($params));
  1226. } catch (Exception $e) {
  1227. sr_log('电科报错' . $e->getMessage());
  1228. return 'success';
  1229. }
  1230. } else {
  1231. return 'success';
  1232. }
  1233. }
  1234. }
  1235. return 'success';
  1236. }
  1237. /**
  1238. * 三方微信sqz回调
  1239. * @param Request $request
  1240. * @return string
  1241. */
  1242. public function thirdPaySqzWeixinBack(Request $request)
  1243. {
  1244. sr_log('----------------------三方微信sqz回调-------------------------');
  1245. sr_log($request->param());
  1246. sr_log('----------------------三方微信sqz回调-------------------------');
  1247. $params = $request->param();
  1248. if (isset($params['orderid']) && isset($params['opstate']) && isset($params['ovalue'])) {
  1249. // 校验签名
  1250. if (isset($params['sign'])) {
  1251. $sign = md5('orderid=' . $params['orderid'] . '&opstate=' . $params['opstate'] . '&ovalue=' . $params['ovalue'] . env('PAYSQZ.SIGNKEY'));
  1252. if ($sign === $params['sign']) {
  1253. if ($params['opstate'] == 0) {
  1254. Db::startTrans();
  1255. try {
  1256. $service = new ThirdPayServices();
  1257. $service->payBack($params['orderid'], $params['ovalue'], 17, json_encode($params));
  1258. Db::commit();
  1259. } catch (\Exception $e) {
  1260. Db::rollback();
  1261. sr_log($e->getMessage());
  1262. return 'opstate=0' . $e->getMessage();
  1263. }
  1264. } else {
  1265. return 'opstate=01';
  1266. }
  1267. } else {
  1268. return 'opstate=0';
  1269. }
  1270. }
  1271. }
  1272. return 'opstate=0';
  1273. }
  1274. /**
  1275. * 三方银行快捷sqz回调
  1276. * @param Request $request
  1277. * @return string
  1278. */
  1279. public function thirdPaySqzKuaiBack(Request $request)
  1280. {
  1281. sr_log('----------------------三方银行快捷sqz回调-------------------------');
  1282. sr_log($request->param());
  1283. sr_log('----------------------三方银行快捷sqz回调-------------------------');
  1284. $params = $request->param();
  1285. if (isset($params['orderid']) && isset($params['opstate']) && isset($params['ovalue'])) {
  1286. // 校验签名
  1287. if (isset($params['sign'])) {
  1288. $sign = md5('orderid=' . $params['orderid'] . '&opstate=' . $params['opstate'] . '&ovalue=' . $params['ovalue'] . env('PAYSQZ.SXY_SIGNKEY'));
  1289. if ($sign === $params['sign']) {
  1290. if ($params['opstate'] == 0) {
  1291. Db::startTrans();
  1292. try {
  1293. $service = new ThirdPayServices();
  1294. $service->payBack($params['orderid'], $params['ovalue'], 18, json_encode($params));
  1295. Db::commit();
  1296. } catch (\Exception $e) {
  1297. Db::rollback();
  1298. sr_log($e->getMessage());
  1299. return 'opstate=0' . $e->getMessage();
  1300. }
  1301. } else {
  1302. return 'opstate=01';
  1303. }
  1304. } else {
  1305. sr_log('yinsheng快捷银行签名有问题');
  1306. return 'opstate=01';
  1307. }
  1308. }
  1309. }
  1310. return 'opstate=0';
  1311. }
  1312. /**
  1313. * Ys银盛第三方支付回调
  1314. * @param Request $request
  1315. * @return string
  1316. */
  1317. public function thirdPayYsBack(Request $request)
  1318. {
  1319. $params = $request->post();
  1320. $res = $this->sign_verify($params);
  1321. $date = date('Y-m-d H:i:s');
  1322. $outTradeNo = isset($params['out_trade_no']) ? $params['out_trade_no'] : '0';
  1323. $cacheKey = "caches:payment:ysBack:{$outTradeNo}";
  1324. RedisCache::set($cacheKey . '_param', ['params' => $params, 'sign' => $res, 'date' => $date], 7200);
  1325. if ($res) {
  1326. Db::startTrans();
  1327. try {
  1328. $service = new ThirdPayServices();
  1329. $service->payBack($params['out_trade_no'], $params['settlement_amount'], 20, json_encode($params), $cacheKey);
  1330. Db::commit();
  1331. } catch (\Exception $e) {
  1332. Db::rollback();
  1333. RedisCache::set($cacheKey . '_fail', ['error' => '银盛回调报错:' . $e->getMessage(), 'params' => $params, 'sign' => $res, 'date' => $date], 7200);
  1334. return 'success';
  1335. }
  1336. } else {
  1337. RedisCache::set($cacheKey . '_signFail', ['error' => '银盛签名有问题', 'params' => $params, 'sign' => $res, 'date' => $date], 7200);
  1338. return 'success';
  1339. }
  1340. return 'success';
  1341. }
  1342. /**
  1343. * 验签转明码
  1344. * @param input check
  1345. * @param input msg
  1346. * @return data
  1347. * @return success
  1348. */
  1349. public function sign_check($sign, $data)
  1350. {
  1351. $publickeyFile = env('ZLYS.CER_PATH'); //公钥
  1352. $certificateCAcerContent = file_get_contents($publickeyFile);
  1353. $certificateCApemContent = '-----BEGIN CERTIFICATE-----' . PHP_EOL . chunk_split(base64_encode($certificateCAcerContent), 64, PHP_EOL) . '-----END CERTIFICATE-----' . PHP_EOL;
  1354. // 签名验证
  1355. $success = openssl_verify($data, base64_decode($sign), openssl_get_publickey($certificateCApemContent), OPENSSL_ALGO_SHA1);
  1356. return $success;
  1357. }
  1358. /**
  1359. * 签名验证
  1360. * @param $data
  1361. * @return bool
  1362. */
  1363. public function sign_verify($data)
  1364. {
  1365. //返回的数据处理
  1366. $sign = trim($data['sign']);
  1367. unset($data['sign']);
  1368. ksort($data);
  1369. $url = "";
  1370. foreach ($data as $key => $val) {
  1371. /* 验证签名 */
  1372. if ($val) $url .= $key . '=' . $val . '&';
  1373. }
  1374. $str = trim($url, '&');
  1375. if ($this->sign_check($sign, $str) != true) {
  1376. return false;
  1377. } else {
  1378. return true;
  1379. }
  1380. }
  1381. /**
  1382. * 用户银行卡绑定回调
  1383. * @param Request $request
  1384. * @return string
  1385. * @throws \think\db\exception\DataNotFoundException
  1386. * @throws \think\db\exception\DbException
  1387. * @throws \think\db\exception\ModelNotFoundException
  1388. */
  1389. public function userSignBank(Request $request)
  1390. {
  1391. $para = $request->param();
  1392. $date = date('Y-m-d H:i:s');
  1393. $cacheKey = "caches:userBankSign:callback:";
  1394. RedisCache::set($cacheKey . 'param', ['msg' => '支付三方签约sqz回调', 'params' => $para, 'date' => $date], 7200);
  1395. if (isset($para['userno']) && $para['userno']) {
  1396. // 校验签名
  1397. if (isset($para['orderid']) && isset($para['opstate']) && isset($para['userno']) && isset($para['sign'])) {
  1398. $sign = md5('orderid=' . $para['orderid'] . '&opstate=' . $para['opstate'] . '&userno=' . $para['userno'] . env('PAYSQZ.SIGNKEY'));
  1399. if ($sign === $para['sign']) {
  1400. if (UserBankSignService::make()->checkHasBySignOrderId($para['orderid'])) {
  1401. // 获取userno 然后保存
  1402. Db::name('user_bank_sign')->where('signorder_id', $para['orderid'])->save([
  1403. 'userno' => $para['userno'],
  1404. 'status' => 2
  1405. ]);
  1406. }
  1407. return 'success';
  1408. } else {
  1409. return 'error';
  1410. }
  1411. }
  1412. }
  1413. return 'error';
  1414. }
  1415. /**
  1416. * 之前对接的支付备份
  1417. * @param Request $request
  1418. * @return \think\Response
  1419. */
  1420. private function payOldAction(Request $request)
  1421. {
  1422. $setting = [];
  1423. $appresource = $request->post('app_sources', '');
  1424. $order_type = $request->post('order_type');
  1425. if (empty($order_type)) {
  1426. return api_error_return('参数错误');
  1427. }
  1428. // 商城购买
  1429. if ($order_type == 4) {
  1430. if ($appresource == 'android') {
  1431. // 石学长 银联支付
  1432. array_push($setting, ['is_open' => 1, 'channel' => 15, 'title' => '银联(协议绑卡)', 'icon' => getWebUrl() . '/static/img/payconfig/ic_yinlian_pay.png']);
  1433. }
  1434. if ($appresource == 'ios') {
  1435. // 石学长 银联支付
  1436. array_push($setting, ['is_open' => 1, 'channel' => 15, 'title' => '银联', 'icon' => getWebUrl() . '/static/img/payconfig/ic_yinlian_pay.png']);
  1437. }
  1438. }
  1439. // 购买服务商
  1440. if ($order_type == 6) {
  1441. if ($appresource == 'android') {
  1442. // 石学长 银联支付
  1443. array_push($setting, ['is_open' => 1, 'channel' => 15, 'title' => '银联(协议绑卡)', 'icon' => getWebUrl() . '/static/img/payconfig/ic_yinlian_pay.png']);
  1444. // 无卡快捷支付 直连银盛
  1445. array_push($setting, ['is_open' => 1, 'channel' => 20, 'title' => '无卡快捷银联支付(支持信用卡)', 'icon' => getWebUrl() . '/static/img/payconfig/ic_yinlian_pay.png']);
  1446. }
  1447. if ($appresource == 'ios') {
  1448. // 石学长 银联支付
  1449. array_push($setting, ['is_open' => 1, 'channel' => 15, 'title' => '银联(协议绑卡)', 'icon' => getWebUrl() . '/static/img/payconfig/ic_yinlian_pay.png']);
  1450. // 无卡快捷支付
  1451. array_push($setting, ['is_open' => 1, 'channel' => 20, 'title' => '无卡快捷银联支付(支持信用卡)', 'icon' => getWebUrl() . '/static/img/payconfig/ic_yinlian_pay.png']);
  1452. }
  1453. }
  1454. }
  1455. }