SoapController.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Handlers\ExpressHandler;
  4. use App\Models\Enroll;
  5. use App\Models\EnrollUser;
  6. use App\Models\EnrollUserExpress;
  7. use App\Models\Express;
  8. use App\Models\Soap;
  9. use App\Models\UserA;
  10. use Carbon\Carbon;
  11. use EasyWeChat\Factory;
  12. use EasyWeChatComposer\EasyWeChat;
  13. use Illuminate\Http\Request;
  14. use Illuminate\Support\Facades\Auth;
  15. use Illuminate\Support\Facades\Cache;
  16. use Illuminate\Support\Facades\DB;
  17. use Illuminate\Support\Facades\Log;
  18. use Overtrue\EasySms\EasySms;
  19. class SoapController extends Controller{
  20. public function GetStatus(){
  21. $id=Auth::user()->id;
  22. $re=Soap::where('is_pay',1)->where('user_id',$id)->first();
  23. if($re){
  24. return $this->success(['status'=>true]);
  25. }
  26. return $this->success(['status'=>false]);
  27. }
  28. public function pays(Request $request)
  29. {
  30. $num=$request->input('num',10);
  31. $price=$request->input('price');
  32. $cost=$request->input('cost');
  33. $goods_type=$request->input('goods_type');
  34. $user_name=$request->input('user_name','ss');
  35. $area_code=$request->input('area_code');
  36. $mobile=$request->input('mobile',15236877164);
  37. $province=$request->input('province','河南省');
  38. $city=$request->input('city','郑州市');
  39. $area=$request->input('area','金水区');
  40. $address=$request->input('address','是啥');
  41. $id=$request->input('id',null);
  42. DB::beginTransaction();
  43. try{
  44. $options = $this->options();
  45. $payment = Factory::payment($options);
  46. $jssdk = $payment->jssdk;
  47. if ($id){
  48. $enrolls=Soap::find($id);
  49. if ($enrolls){
  50. $re = $payment->order->queryByOutTradeNumber($enrolls->enroll_no);
  51. if (isset($re['transaction_id'])) {
  52. return $this->error(20015,'','当前订单已经支付,请刷新列表');
  53. }
  54. }
  55. }
  56. if($goods_type==2){
  57. $goods_name='大卫博士专用打包胶带';
  58. $goods_type_code='JD';
  59. }else{
  60. $goods_name='大卫博士竹炭植物精油皂';
  61. $goods_type_code='FZ';
  62. }
  63. if($cost!=$num*$price || $cost<=0){
  64. return $this->error(20015,'','当前订单价格有误');
  65. }
  66. // $cost=$num*8;
  67. // $cost=0.01;
  68. $user=Auth::user();
  69. $expire=date('YmdHis', time() + 130);
  70. $nu = time() . str_pad($user->id, 6, 0, STR_PAD_LEFT) . random_int(11111111, 99999999);
  71. $order_num ='DWBS-'.$goods_type_code.'-'.str_pad($user->id, 6, 0, STR_PAD_LEFT).Carbon::now()->format('md') . random_int(1111, 9999);
  72. $attributes = [
  73. 'time_expire' => $expire,
  74. 'trade_type' => 'JSAPI', // 支付方式,小程序支付使用JSAPI
  75. 'body' => $goods_name, // 订单说明
  76. 'detail' => $goods_name, // 订单说明
  77. 'out_trade_no' => $nu, // 自定义订单号
  78. 'total_fee' =>$cost*100, // 单位:分
  79. 'openid' => $user->openid, // 当前用户的openId
  80. // 'notify_url' =>'http://api.app.cliu.cc/api/pay/message',
  81. ];
  82. $result = $payment->order->unify($attributes);
  83. if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') {
  84. if ($id){
  85. $enroll=Soap::find($id);
  86. if (!$enroll){
  87. return $this->error(500231,'','请返回列表刷新后提交');
  88. }
  89. }else{
  90. $enroll=new Soap();
  91. $enroll->order_end=Carbon::now()->addDays(1);
  92. }
  93. $enroll->user_id = $user->id;
  94. $enroll->num = $num;
  95. $enroll->price = $price;
  96. $enroll->enroll_no = $nu;
  97. $enroll->cost = $cost;
  98. $enroll->is_pay = 0;
  99. $enroll->address=$address;
  100. $enroll->area=$area;
  101. $enroll->city=$city;
  102. $enroll->order_num=$order_num;
  103. $enroll->province=$province;
  104. $enroll->user_name=$user_name;
  105. $enroll->mobile=$mobile;
  106. $enroll->sign=$result['sign'];
  107. $enroll->warea_id=$user->warea_id;
  108. $enroll->buy_name=$user->nickname;
  109. $enroll->buy_code=$user->area_code;
  110. $enroll->buy_phone=$user->mobile;
  111. $enroll->goods_name=$goods_name;
  112. $enroll->goods_type=$goods_type;
  113. $enroll->area_code=$area_code;
  114. $enroll->openid=$user->openid;
  115. if (!$enroll->save()){
  116. throw new \Exception('1');
  117. }
  118. $prepayId = $result['prepay_id'];
  119. $config = $jssdk->sdkConfig($prepayId);
  120. DB::commit();
  121. return response()->json([
  122. 'error_code'=>200,
  123. 'code'=>200,
  124. 'msg'=>'成功',
  125. 'data'=>$config
  126. ]);
  127. }
  128. }catch (\Exception $exception){
  129. DB::rollBack();
  130. Log::error($exception->getMessage());
  131. return $this->error(500214,'','调起支付失败');
  132. }
  133. }
  134. public function SearchStatus(Request $request){
  135. $sign=$request->input('sign');
  136. $options = $this->options();
  137. $payment = Factory::payment($options);
  138. $id=Auth::user()->id;
  139. $res = Enroll::where('user_id', $id)->where('is_refund', 0)->where('is_pay', 0)->orderByDesc('created_at')->get();
  140. $s = false;
  141. foreach ($res as $k => $v) {
  142. $re = $payment->order->queryByOutTradeNumber($v->enroll_no);
  143. if (isset($re['transaction_id'])) {
  144. $enroll = Soap::find($v->id);
  145. $enroll->is_pay = 1;
  146. $enroll->trade_no = $re['transaction_id'];
  147. $enroll->save();
  148. $s = true;
  149. }
  150. }
  151. if ($s) {
  152. Log::error('测试测试');
  153. return $this->success(['status'=>true]);
  154. } else {
  155. return $this->error(40056, '', '暂无支付信息,请重新进入');
  156. }
  157. }
  158. /**支付回调*/
  159. public function message(Request $request)
  160. {
  161. Log::error('肥皂购买支付回调');
  162. $options = $this->options();
  163. $payment = Factory::payment($options);
  164. $response = $payment->handlePaidNotify(function ($message, $fail) {
  165. $out_trade_no = $message['out_trade_no']; // 商户订单号
  166. $trade_no = $message['transaction_id']; // 微信支付订单号
  167. $order = Soap::where('enroll_no', '=', $out_trade_no)->first();
  168. if (empty($order)) {
  169. return true; // 告诉微信,我已经处理完了,订单没找到,别再通知我了
  170. }
  171. $r = Cache::get(md5('codes' . $order->user_id));
  172. if (!$r) {
  173. if ($message['return_code'] === 'SUCCESS') { // return_code 表示通信状态,不代表支付状态
  174. // 用户是否支付成功
  175. if ($message['result_code'] === 'SUCCESS') {
  176. $enroll = Soap::where('enroll_no', '=', $out_trade_no)->first();
  177. $enroll->is_pay = 1;
  178. $enroll->trade_no = $trade_no;
  179. $enroll->info = json_encode($message);
  180. $enroll->save();
  181. }
  182. } else {
  183. return $fail('通信失败,请稍后再通知我');
  184. }
  185. }
  186. return true;
  187. });
  188. return $response;
  189. }
  190. protected function options(){
  191. return [
  192. 'app_id' => config('wechat.payment.daweiboshi.app_id'),//config('wechat.payment.default.app_id'),
  193. 'mch_id' => config('wechat.payment.daweiboshi.mch_id'),
  194. 'sub_mch_id' => '',
  195. 'key' => config('wechat.payment.daweiboshi.key'),
  196. 'notify_url' =>url('api/soap/message'),
  197. 'cert_path' =>config('wechat.payment.daweiboshi.cert_path'),
  198. 'key_path' =>config('wechat.payment.daweiboshi.key_path'),
  199. ];
  200. }
  201. /*
  202. * 获取收货地址
  203. * **/
  204. public function GetUserAddress(){
  205. $re=Soap::where('user_id',Auth::user()->id)->select('province','mobile','user_name','city','area','address','area_code')->where('is_pay',1)->orderByDesc('id')->limit(1)->first();
  206. return $this->success($re);
  207. }
  208. /*
  209. * 获取购买记录
  210. * **/
  211. public function GetSoapList(Request $request){
  212. $page_index=$request->input('page_index');
  213. $page_size=$request->input('page_size');
  214. $re=Soap::where('user_id',Auth::user()->id);
  215. if (Auth::user()->id==39516){
  216. $re->where('user_id',39516);
  217. }else{
  218. $re->where('is_pay',1);
  219. }
  220. $count=$re->count();
  221. $re=$re->orderByDesc('id')->skip(($page_index-1)*$page_size)->take($page_size)->get();
  222. return $this->success_list($re,'',$count);
  223. }
  224. /**获取物流轨迹**/
  225. public function get_express(Request $request,ExpressHandler $expressHandler){
  226. $express=Soap::find($request->id);
  227. if (!$express){
  228. return $this->error(40011,'','该物流订单不存在');
  229. }
  230. if ($express->status==2){
  231. return $this->success(json_decode($express->express_info));
  232. }else{
  233. $re=$expressHandler->search($express->express_num,$express->express_code);
  234. $re=(array)$re;
  235. if ($re['State']==3){
  236. DB::beginTransaction();
  237. try{
  238. $express->express_info=json_encode($re);
  239. $express->status=2;
  240. $express->save();
  241. DB::commit();
  242. }catch (\Exception $exception){
  243. Log::error('-------物流信息保存出错--------'.$exception);
  244. DB::rollBack();
  245. }
  246. }
  247. return $this->success($re);
  248. }
  249. }
  250. }