public function toOrderCommit(Request $request)
 {
     // 获取微信重定向返回的code
     $code = $request->input('code', '');
     if ($code != '') {
         //获取code码,以获取openid
         $openid = WXTool::getOpenid($code);
         // 将openid保存到session
         $request->session()->put('openid', $openid);
     }
     $product_ids = $request->input('product_ids', '');
     $product_ids_arr = $product_ids != '' ? explode(',', $product_ids) : array();
     $member = $request->session()->get('member', '');
     $cart_items = CartItem::where('member_id', $member->id)->whereIn('product_id', $product_ids_arr)->get();
     $order = new Order();
     $order->member_id = $member->id;
     $order->save();
     $cart_items_arr = array();
     $cart_items_ids_arr = array();
     $total_price = 0;
     $name = '';
     foreach ($cart_items as $cart_item) {
         $cart_item->product = Product::find($cart_item->product_id);
         if ($cart_item->product != null) {
             $total_price += $cart_item->product->price * $cart_item->count;
             $name .= '《' . $cart_item->product->name . '》';
             array_push($cart_items_arr, $cart_item);
             array_push($cart_items_ids_arr, $cart_item->id);
             $order_item = new OrderItem();
             $order_item->order_id = $order->id;
             $order_item->product_id = $cart_item->product_id;
             $order_item->count = $cart_item->count;
             $order_item->pdt_snapshot = json_encode($cart_item->product);
             $order_item->save();
         }
     }
     CartItem::whereIn('id', $cart_items_ids_arr)->delete();
     $order->name = $name;
     $order->total_price = $total_price;
     $order->order_no = 'E' . time() . '' . $order->id;
     $order->save();
     // JSSDK 相关
     $access_token = WXTool::getAccessToken();
     $jsapi_ticket = WXTool::getJsApiTicket($access_token);
     $noncestr = WXTool::createNonceStr();
     $timestamp = time();
     $url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
     // 签名
     $signature = WXTool::signature($jsapi_ticket, $noncestr, $timestamp, $url);
     // 返回微信参数
     $bk_wx_js_config = new BKWXJsConfig();
     $bk_wx_js_config->appId = config('wx_config.APPID');
     $bk_wx_js_config->timestamp = $timestamp;
     $bk_wx_js_config->nonceStr = $noncestr;
     $bk_wx_js_config->signature = $signature;
     return view('order_commit')->with('cart_items', $cart_items_arr)->with('total_price', $total_price)->with('name', $name)->with('order_no', $order->order_no)->with('bk_wx_js_config', $bk_wx_js_config);
 }
 public function wxPay(Request $request)
 {
     $openid = $request->session()->get('openid', '');
     if ($openid == '') {
         $m3_result = new M3Result();
         $m3_result->status = 1;
         $m3_result->message = 'Session已过期, 请重新提交订单';
         return $m3_result;
     }
     return WXTool::wxPayData($request->input('name'), $request->input('order_no'), 1, $openid);
 }
Example #3
0
 public static function wxPayData($body, $out_trade_no, $total_fee, $openid)
 {
     $appid = config('wx_config.APPID');
     $mch_id = config('wx_config.MCHID');
     $nonce_str = WXTool::createNonceStr();
     $spbill_create_ip = $_SERVER["REMOTE_ADDR"];
     $notify_url = 'http://' . $_SERVER['HTTP_HOST'] . '/service/pay/wx_notify';
     $time_start = date("YmdHis");
     $time_expire = date("YmdHis", time() + 900);
     $trade_type = 'JSAPI';
     // 生成预处理签名
     $stringA = "appid={$appid}&body={$body}&mch_id={$mch_id}&nonce_str={$nonce_str}&notify_url={$notify_url}" . "&openid={$openid}&out_trade_no={$out_trade_no}&spbill_create_ip={$spbill_create_ip}" . "&time_expire={$time_expire}&time_start={$time_start}&total_fee={$total_fee}&trade_type={$trade_type}";
     $stringSignTemp = $stringA . '&key=' . config('wx_config.KEY');
     $sign = strtoupper(md5($stringSignTemp));
     $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
     $xmlTpl = "<xml>\n              \t<appid><![CDATA[%s]]></appid>\n              \t<body><![CDATA[%s]]></body>\n              \t<mch_id><![CDATA[%s]]></mch_id>\n              \t<nonce_str><![CDATA[%s]]></nonce_str>\n              \t<notify_url><![CDATA[%s]]></notify_url>\n              \t<out_trade_no><![CDATA[%s]]></out_trade_no>\n              \t<spbill_create_ip><![CDATA[%s]]></spbill_create_ip>\n                <time_start><![CDATA[%s]]></time_start>\n                <time_expire><![CDATA[%s]]></time_expire>\n              \t<total_fee><![CDATA[%s]]></total_fee>\n              \t<trade_type><![CDATA[%s]]></trade_type>\n              \t<sign><![CDATA[%s]]></sign>\n                <openid><![CDATA[%s]]></openid>\n              </xml>";
     $post_data = sprintf($xmlTpl, $appid, $body, $mch_id, $nonce_str, $notify_url, $out_trade_no, $spbill_create_ip, $time_start, $time_expire, $total_fee, $trade_type, $sign, $openid);
     $return_data = WXTool::httpPost($url, $post_data);
     libxml_disable_entity_loader(true);
     $data = simplexml_load_string($return_data, 'SimpleXMLElement', LIBXML_NOCDATA);
     Log::info('查看错误信息: ' . $data->return_msg);
     // 重新签名
     $timeStamp = time();
     $nonceStr = WXTool::createNonceStr();
     $package = 'prepay_id=' . $data->prepay_id;
     $signType = 'MD5';
     $stringA = "appId={$appid}&nonceStr={$nonceStr}&package={$package}&signType={$signType}&timeStamp={$timeStamp}";
     $stringSignTemp = $stringA . '&key=' . config('wx_config.KEY');
     $sign = strtoupper(md5($stringSignTemp));
     // 返回相关参数
     $bk_wx_pay_config = new BKWXPayConfig();
     $bk_wx_pay_config->timestamp = $timeStamp;
     $bk_wx_pay_config->nonceStr = $nonceStr;
     $bk_wx_pay_config->package = $package;
     $bk_wx_pay_config->signType = $signType;
     $bk_wx_pay_config->paySign = $sign;
     $bk_wx_pay_config->status = 0;
     $bk_wx_pay_config->message = '返回成功';
     Log::info($bk_wx_pay_config->toJson());
     return $bk_wx_pay_config->toJson();
 }