WechatMiniProgramLogic.php 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. <?php
  2. namespace common\logic\wechat;
  3. use common\components\WechatCache;
  4. use common\enums\StatusEnum;
  5. use common\helpers\CurlHelper;
  6. use common\models\order\OrderDetail;
  7. use common\models\order\OrderExpress;
  8. use common\models\user\User;
  9. use common\models\user\UserInfo;
  10. use EasyWeChat\Factory;
  11. use common\enums\DeliveryCompanyEnum;
  12. class WechatMiniProgramLogic
  13. {
  14. public static function uploadShippingInfoWechat($params){
  15. $mall_id = $params['mall_id'];
  16. $openid = $params['openid'];
  17. $third_trade_no = $params['third_trade_no'];
  18. $delivery_mode = $params['delivery_mode'];
  19. $logistics_type = $params['logistics_type'];
  20. $receiver_contact = $params['receiver_contact'];
  21. $item_desc = $params['item_desc'];
  22. $is_all_delivered = $params['is_all_delivered'] ;
  23. $mini_program = \Yii::$app->services->setting->mall->get($mall_id, 'mini_program');
  24. $wechat = Factory::miniProgram($mini_program);
  25. $token_arr = $wechat->access_token->setCache(new WechatCache())->getToken();
  26. \Yii::$app->custom->logs('token==========:' . json_encode($token_arr));
  27. $url = 'https://api.weixin.qq.com/wxa/sec/order/upload_shipping_info?access_token=' . $token_arr['access_token'];
  28. $shipping =[
  29. 'item_desc'=>$item_desc,
  30. 'contact'=>[
  31. 'receiver_contact'=>$receiver_contact
  32. ],
  33. ];
  34. if(isset($params['tracking_no'])){
  35. $shipping['tracking_no'] =$params['tracking_no'];
  36. $shipping['express_company'] = DeliveryCompanyEnum::getDeliveryIdByName($params['express_company']);
  37. }
  38. $shipping_list = [$shipping];
  39. $post = [
  40. 'order_key'=>[
  41. 'order_number_type'=>2,
  42. 'transaction_id'=>$third_trade_no,
  43. ],
  44. 'delivery_mode'=>$delivery_mode,
  45. 'is_all_delivered'=>$is_all_delivered,
  46. 'logistics_type'=>$logistics_type,
  47. 'shipping_list'=>$shipping_list,
  48. 'upload_time'=>date("c", time()),
  49. 'payer'=>[
  50. 'openid'=>$openid,
  51. ],
  52. ];
  53. \Yii::$app->custom->logs('uploadShippingInfoWechat:request'.json_encode($post));
  54. $res = CurlHelper::postJsonUnicode($url, $post);//请求微信服务端
  55. if($res['errcode']==40001){
  56. $wechat->access_token->setCache(new WechatCache())->getToken(true);
  57. self::uploadShippingInfoWechat($params);
  58. }
  59. var_dump('=====================+++++++++++'.json_encode($res));
  60. \Yii::$app->custom->logs('uploadShippingInfoWechat:response'.json_encode($res));
  61. var_dump(json_encode($res));
  62. }
  63. public static function notifyConfirmReceiveWechat($params)
  64. {
  65. $mall_id = $params['mall_id'];
  66. $transaction_id = $params['transaction_id'];
  67. $received_time = $params['received_time'];
  68. $mini_program = \Yii::$app->services->setting->mall->get($mall_id, 'mini_program');
  69. $wechat = Factory::miniProgram($mini_program);
  70. $token_arr = $wechat->access_token->setCache(new WechatCache())->getToken();
  71. \Yii::$app->custom->logs('token==========:' . json_encode($token_arr));
  72. $url = 'https://api.weixin.qq.com/wxa/sec/order/notify_confirm_receive?access_token=' . $token_arr['access_token'];
  73. $post = [
  74. 'transaction_id' => $transaction_id,
  75. 'received_time' => $received_time,
  76. ];
  77. \Yii::$app->custom->logs('notifyConfirmReceiveWechat:request' . json_encode($post));
  78. $res = CurlHelper::postJsonUnicode($url, $post);//请求微信服务端
  79. \Yii::$app->custom->logs('notifyConfirmReceiveWechat:response' . json_encode($res));
  80. }
  81. public static function setMsgJumpPath($params)
  82. {
  83. $mall_id = $params['mall_id'];
  84. $mini_program = \Yii::$app->services->setting->mall->get($mall_id, 'mini_program');
  85. $wechat = Factory::miniProgram($mini_program);
  86. $token_arr = $wechat->access_token->setCache(new WechatCache())->getToken();
  87. \Yii::$app->custom->logs('token==========:' . json_encode($token_arr));
  88. $url = 'https://api.weixin.qq.com/wxa/sec/order/set_msg_jump_path?access_token=' . $token_arr['access_token'];
  89. $post = [
  90. // 'path' => 'pages/public/deliveryInformation',
  91. 'path' => '',
  92. ];
  93. \Yii::$app->custom->logs('setMsgJumpPath:request' . json_encode($post));
  94. $res = CurlHelper::postJsonUnicode($url, $post);//请求微信服务端
  95. \Yii::$app->custom->logs('setMsgJumpPath:response' . json_encode($res));
  96. }
  97. public static function getOrder($params)
  98. {
  99. $mall_id = $params['mall_id'];
  100. $mini_program = \Yii::$app->services->setting->mall->get($mall_id, 'mini_program');
  101. $wechat = Factory::miniProgram($mini_program);
  102. $token_arr = $wechat->access_token->setCache(new WechatCache())->getToken();
  103. \Yii::$app->custom->logs('token==========:' . json_encode($token_arr));
  104. $url = 'https://api.weixin.qq.com/wxa/sec/order/get_order?access_token=' . $token_arr['access_token'];
  105. $post = [
  106. 'transaction_id' => $params['transaction_id'],
  107. ];
  108. \Yii::$app->custom->logs('getOrder:request' . json_encode($post));
  109. $res = CurlHelper::postJsonUnicode($url, $post);//请求微信服务端
  110. \Yii::$app->custom->logs('getOrder:response' . json_encode($res));
  111. return $res;
  112. }
  113. public static function isTradeManaged($mall_id){
  114. $mini_program = \Yii::$app->services->setting->mall->get($mall_id, 'mini_program');
  115. $wechat = Factory::miniProgram($mini_program);
  116. $token_arr = $wechat->access_token->setCache(new WechatCache())->getToken();
  117. \Yii::$app->custom->logs('token==========:' . json_encode($token_arr));
  118. $url = 'https://api.weixin.qq.com/wxa/sec/order/is_trade_managed?access_token=' . $token_arr['access_token'];
  119. $post = [
  120. 'appid' => $mini_program['app_id']??'',
  121. ];
  122. \Yii::$app->custom->logs('isTradeManaged:request' . json_encode($post));
  123. $res = CurlHelper::postJsonUnicode($url, $post);//请求微信服务端
  124. var_dump($res);
  125. \Yii::$app->custom->logs('isTradeManaged:response' . json_encode($res));
  126. }
  127. /**
  128. * 虚拟发货
  129. * @param $params
  130. * @return void
  131. * @throws \Exception
  132. */
  133. public static function uploadShippingInfoWechatByVirtually($params){
  134. $user = User::findOne(['id'=>$params['user_id']]);
  135. $mobile = $user['mobile'];
  136. //微信支付
  137. $user_info_model = UserInfo::findOne(['mall_id'=>$params['mall_id'],'user_id'=>$params['user_id'],'platform'=>'mp-wx']);
  138. if(empty($user_info_model)){
  139. throw new \Exception("user_id,mp-wx:".$params['user_id'].",user_info_model不存在");
  140. }
  141. $params['openid'] = $user_info_model['openid'];;
  142. // $logistics_type = 1;//物流模式,发货方式枚举值:1、实体物流配送采用快递公司进行实体物流配送形式 2、同城配送 3、虚拟商品,虚拟商品,例如话费充值,点卡等,无实体配送形式 4、用户自提
  143. $params['logistics_type'] = 3;
  144. $params['receiver_contact'] = substr_replace($mobile, '****', 3, 4);
  145. $params['item_desc'] = mb_substr($params['item_desc'],0,120);
  146. WechatMiniProgramLogic::uploadShippingInfoWechat($params);
  147. }
  148. /**
  149. * 主商城订单发货
  150. * @param $params
  151. * @return true|void
  152. */
  153. public static function uploadShippingInfoWechatByOrder($params)
  154. {
  155. $mall_id = $params['mall_id'];
  156. $user_id = $params['user_id'];
  157. $order_id = $params['order_id'];
  158. $order_detail_ids = $params['order_detail_ids'];
  159. $second_trade_no = $params['second_trade_no'];
  160. $mobile = $params['mobile'];
  161. //微信支付
  162. $delivery_mode = 1;
  163. $order_detail_rows = OrderDetail::lists(['where'=>[['order_id'=>$order_id]]]);
  164. if(count($order_detail_rows)!=count($order_detail_ids)){
  165. $delivery_mode = 2;
  166. }
  167. $order_detail_list = OrderDetail::lists(['where'=>[['id'=>$order_detail_ids]]]);
  168. if(empty($order_detail_list)) throw new \Exception("order_detail_ids:".join(',',$order_detail_ids).",订单详情不存在");
  169. $user_info_model = UserInfo::findOne(['mall_id'=>$mall_id,'user_id'=>$user_id,'platform'=>'mp-wx','status' => StatusEnum::ENABLED]);
  170. if(empty($user_info_model))throw new \Exception("user_id,mp-wx:".$user_id.",user_info_model不存在");
  171. $openid = $user_info_model['openid'];
  172. $item_desc = '';
  173. foreach ($order_detail_list as $item){
  174. $item_desc.=$item['goods_name'].',';
  175. }
  176. $is_all_delivered = false;
  177. if($delivery_mode==2){
  178. $order_detail_id_arr = [];
  179. $order_express_list = OrderExpress::lists(['where'=>[['order_id'=>$order_id]]]);
  180. foreach ($order_express_list as $val){
  181. $temp = json_decode($val['order_detail_ids'],true);
  182. $order_detail_id_arr = array_merge($order_detail_id_arr,$temp);
  183. }
  184. if(count($order_detail_rows)==count($order_detail_id_arr)){
  185. $is_all_delivered = true;
  186. }
  187. }
  188. $item_desc =trim($item_desc,',');
  189. $params['mall_id'] = $mall_id;
  190. $params['openid'] = $openid;
  191. $params['third_trade_no'] = $second_trade_no;
  192. $params['delivery_mode'] = $delivery_mode;
  193. $params['is_all_delivered'] = $is_all_delivered;
  194. if(!empty($params['express_no'])){
  195. $logistics_type =1;
  196. $params['tracking_no'] = $params['express_no'];
  197. $params['express_company'] = $params['express_name'];
  198. }else{
  199. $logistics_type = 4;
  200. }
  201. $params['logistics_type'] = $logistics_type;
  202. $params['receiver_contact'] = substr_replace($mobile, '****', 3, 4);
  203. $params['item_desc'] = mb_substr($item_desc,0,120);
  204. WechatMiniProgramLogic::uploadShippingInfoWechat($params);
  205. }
  206. }