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); }
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}¬ify_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(); }