Pay.php 70 KB

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