PayController.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. <?php
  2. namespace App\Http\Controllers\Pay;
  3. use App\Facade\Site;
  4. use App\Libs\ApiResponse;
  5. use App\Models\User\User;
  6. use App\Services\Pay\PayService;
  7. use App\Services\Pay\ProductService;
  8. use App\Transformer\Pay\PayTransformer;
  9. use Illuminate\Http\Request;
  10. use Illuminate\Routing\Controller as BaseController;
  11. use Illuminate\Support\Facades\Redis;
  12. use Vinkla\Hashids\Facades\Hashids;
  13. use Log;
  14. use Ycpay\Byte;
  15. use App\Services\User\UserService;
  16. class PayController extends BaseController
  17. {
  18. use ApiResponse;
  19. protected $payService;
  20. public function __construct(
  21. PayService $payService
  22. )
  23. {
  24. $this->payService = $payService;
  25. }
  26. public function create_order(Request $request) {
  27. $uid = Site::getUid();
  28. $user = User::find($uid);
  29. \Log::info('create_order:'.$uid.' request:'.json_encode($request->all()));
  30. $product_id = $request->get('product_id');
  31. $phone_type = $request->has('phone_type')?$request->get('phone_type'):'android';
  32. if (!in_array($phone_type,['ios','android'])){
  33. $phone_type = 'android';
  34. }
  35. if(empty($product_id) || empty($user)) return $this->error('50013:参数异常');
  36. // if(empty($uid)) return $this->error('50012:非法登录');
  37. $trade_no = generateOrderSn();
  38. $product = ProductService::getProductSingle($product_id);
  39. if(empty($product)) return $this->error('50013:参数异常product_id');
  40. $price = $product->price;
  41. // 内测uid 1分钱
  42. if (in_array($uid, explode(',', env('TEST_UID')))) {
  43. $price = 0.01;
  44. \Log::info('create_order_1fen_uid:'.$uid);
  45. }
  46. if(empty($price)) return $this->error('50013:参数异常price');
  47. $send_order_id = Site::getSendOrderId();
  48. $distribution_channel_id = Site::getChannelId();
  49. if(empty($distribution_channel_id)) return $this->error('50013:参数异常channel_id');
  50. $from_bid = Site::getRecentBid();
  51. $create_ip = getIpAddr();
  52. $order_type = $product->type;
  53. $result = $create_order_param = [];
  54. $order_param = [
  55. 'price'=>$price,
  56. 'uid'=>$uid,
  57. 'order_type'=>$order_type,
  58. 'distribution_channel_id'=>$distribution_channel_id,
  59. 'create_ip'=>$create_ip,
  60. 'from_bid'=>$from_bid,
  61. 'send_order_id'=>$send_order_id,
  62. 'trade_no'=>$trade_no,
  63. 'product_id'=>$product_id,
  64. 'pay_type'=>'Byte',
  65. 'openid'=>$user->openid,
  66. 'phone_type'=>$phone_type,
  67. ];
  68. \Log::info('order_param:'.json_encode($order_param));
  69. $result = $this->payService->create_order($order_param);
  70. //{"err_no":0,"err_tips":"success","data":{"order_id":"N7230729566975953204","order_token":"CgwIARDGJRiuMiABKAESTgpMszqeb0L8DTtnY44geDAfYHAsrZrKRsbwMz8GdAz8fRmJwGJf860xXpHLTPBlka94g6Gsm6NuyakLaHYoTmtg9uHag7rRZVGXrpnDtRoA.L","url":""}}
  71. //{"err_no":2008,"err_tips":"\u7b7e\u540d\u6821\u9a8c\u5f02\u5e38\uff0c\u8bf7\u4f7f\u7528\u6b63\u786e\u7684\u7b7e\u540d","data":null}
  72. if(isset($result['err_no']) && $result['err_no'] == 0){
  73. $create_order_param = [
  74. 'trade_no'=>$trade_no,
  75. 'order_id'=>$result['data']['order_id'],
  76. 'order_token'=>$result['data']['order_token'],
  77. 'pay_url'=>$result['data']['url'],
  78. ];
  79. // 维护orders的url字段和order_id字段
  80. $order = $this->payService->getByTradeNo($trade_no);
  81. $order->tiktok_order_id = $result['data']['order_id'];
  82. $order->pay_url = $result['data']['url'];
  83. $order->save();
  84. }else{
  85. if(isset($result['err_tips'])){
  86. $error_msg = $result['err_tips'];
  87. }else{
  88. $error_msg = isset($result['msg'])?$result['msg']:'';
  89. }
  90. \Log::info('create_order_ept:'.$error_msg);
  91. return $this->error('20010:创建订单异常');
  92. }
  93. return $this->success($create_order_param, [new PayTransformer(), 'createOrderParams']);
  94. }
  95. /**
  96. * 抖音官方回调
  97. {
  98. "msg": "{\"appid\":\"tta48fd2323bb0abbc01\",\"cp_orderno\":\"2023051916413016844856905211716\",
  99. \"cp_extra\":\"\",\"way\":\"2\",\"channel_no\":\"2023051922001465081408495054\",\"channel_gateway_no\":\"\",
  100. \"payment_order_no\":\"DPS2305191641249038630039365653\",\"out_channel_order_no\":\"2023051922001465081408495054\",
  101. \"total_amount\":1,\"status\":\"SUCCESS\",\"seller_uid\":\"72265320820071651950\",\"extra\":\"\",
  102. \"item_id\":\"\",\"paid_at\":1684485701,\"message\":\"\",\"order_id\":\"N7234810920067680567\",
  103. \"ec_pay_trade_no\":\"DTPP2305191641229006646669375653\"}",
  104. "msg_signature": "d4402df600eee04fd3350259c1656a10b6006679",
  105. "nonce": "7346",
  106. "timestamp": "1684485701",
  107. "type": "payment",
  108. "_url": "\/pay\/receive_dy_pay_notify"
  109. }
  110. *
  111. */
  112. function dycallback(Request $request)
  113. {
  114. $callback_params = $request->all();
  115. \Log::info('dycallback:'.json_encode($callback_params));
  116. $callback_params = json_decode(json_encode($callback_params),true);
  117. $trade_no = $transaction_id = '';
  118. if(isset($callback_params['msg']) && $callback_params['msg']){
  119. $callback_params_decode = json_decode($callback_params['msg'],true);
  120. $trade_no = $callback_params_decode['cp_orderno'];
  121. $order_id = $callback_params_decode['order_id'];
  122. $transaction_id = $callback_params_decode['channel_no'];
  123. }
  124. \Log::info('dycallback:trade_no:'.$trade_no.' transaction_id:'.$transaction_id.' order_id:'.$order_id);
  125. $calllback = $this->payService->orderCallBack($trade_no, $transaction_id,$order_id);
  126. if($calllback){
  127. \Log::info('dycallback:trade_no_success'.$trade_no);
  128. exit('{"err_no":0,"err_tips":"success"}');
  129. }
  130. \Log::info('dycallback:trade_no_fail'.$trade_no);
  131. exit('fail');
  132. }
  133. // 退款回调
  134. function refund_dycallback(Request $request)
  135. {
  136. $callback_params = $request->all();
  137. \Log::info('refund_dycallback:'.json_encode($callback_params));
  138. exit('{"err_no":0,"err_tips":"success"}');
  139. }
  140. /**
  141. * TODO 加上查询逻辑
  142. * @param Request $request
  143. * @return mixed
  144. */
  145. public function query_user_pay(Request $request) {
  146. $uid = Site::getUid();
  147. \Log::info('query_user_pay:'.$uid.' request:'.json_encode($request->all()));
  148. $trade_no = $request->get('trade_no');
  149. if(empty($trade_no)) return $this->error('50013:参数异常');
  150. return $this->success(['is_paid'=>1]);
  151. }
  152. /**
  153. * 前端支付相关信息回调
  154. * @param Request $request
  155. * @return mixed
  156. */
  157. public function pay_info_callback(Request $request) {
  158. $uid = Site::getUid();
  159. $user = User::find($uid);
  160. \Log::info('pay_info_callback:'.$uid.' request:'.json_encode($request->all()));
  161. $trade_no = $request->get('trade_no');
  162. $order_status = $request->get('order_status');
  163. if(empty($order_status) || empty($trade_no)) return $this->error('50013:参数异常');
  164. // 当前只支持 取消支付,待支付和成功在其他函数直接执行
  165. if(in_array($order_status,[2])){
  166. $this->payService->report_to_douyin($trade_no, $user->openid, $order_status);
  167. }
  168. return $this->success(['is_success'=>1]);
  169. }
  170. }