微信app支付流程
需要的配置參數
private function wechat($body,$indent_id,$cou,$user_id,$total_fee,$ip,$domain,$nonce_str){ //微信配置信息和初始邏輯
$appid= \WxPayConfig::APPID; //appid (微信開放平台的應用appid)
$body= $body; //商品描述
$mch_id= \WxPayConfig::MCHID; //商戶號(注冊商戶平台時,發置注冊郵箱的商戶id)
$notify_url= ******; //回調地址(外部可訪問的)
$out_trade_no= time(); //商戶訂單編號自定義
$ip = $ip;
$total_fee= $total_fee; //支付金額 分
$key = \WxPayConfig::KEY;(商戶平台api支付處設置的key)
$param = $this->signature($appid,$body,$mch_id,$nonce_str,$notify_url,$out_trade_no,$ip,$total_fee,$key); //請求數據轉碼,xml格式 下文會有介紹
$payment = Payment::create([//插入預訂單(這個對應數據庫字段就行,根據自己情況來)
'indent_id'=> $indent_id, //訂單id
'coupon_id'=> $cou==null?0:$cou->id, //優惠券id
'ordernum'=> $out_trade_no,
'user_id'=> $user_id, //用戶id
'update_time' => time(),
'create_time'=> time(),
'way'=> $body,
'content' => 'APP馬上拍【微信】'
]);
return $param;
}
2.請求數據組裝成xml格式
private function signature($appid,$body,$mch_id,$nonce_str,$notify_url,$out_trade_no,$ip,$total_fee,$key){ //支付請求數據組裝
$stringA = "appid=$appid&body=$body&mch_id=$mch_id&nonce_str=$nonce_str¬ify_url=$notify_url&out_trade_no=$out_trade_no&spbill_create_ip=$ip&total_fee=$total_fee&trade_type=APP";
$stringSignTemp = $stringA."&key=$key";
$sign = strtoupper(md5($stringSignTemp)); //簽名
$param = "<xml>\n";
$param .= "<appid>{$appid}</appid>\n";
$param .= "<body>{$body}</body>\n";
$param .= "<mch_id>{$mch_id}</mch_id>\n";
$param .= "<nonce_str>{$nonce_str}</nonce_str>\n";
$param .= "<notify_url>{$notify_url}</notify_url>\n";
$param .= "<out_trade_no>{$out_trade_no}</out_trade_no>\n";
$param .= "<spbill_create_ip>{$ip}</spbill_create_ip>\n";
$param .= "<total_fee>{$total_fee}</total_fee>\n";
$param .= "<trade_type>APP</trade_type>\n";
$param .= "<sign>{$sign}</sign>\n";
$param .= "</xml>";
return $param;
}
3.統一下單,拿到需要的參數,並二次簽名,(這一步,就可以拿到所有的字段,倒是后app請求的時候,返回給app就可以,app藉此可以調起app支付)
private function unify_curl($param,$ip,$total_fee,$domain,$body,$timestamp){//統一下單(拿到微信臨時會話id,二次簽名組裝,返回給app ,)
$xml = $this->post_curl("https://api.mch.weixin.qq.com/pay/unifiedorder",$param); //發起請求
$info = json_decode(json_encode(simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA)),true); //數據結果解析
$appid= $info['appid'];//二次簽名
$body= $body; //商品描述
$mch_id= $info['mch_id'];
$ip = $ip;
$key = \WxPayConfig::KEY;
$prepay_id= $info['prepay_id'];
$noncestr = $info['nonce_str'];
$SignA = strtoupper(md5("appid=$appid&noncestr=$noncestr&package=Sign=WXPay&partnerid=$mch_id&prepayid=$prepay_id×tamp=$timestamp&key=$key"));
$info['sign']= $SignA;
$info['timestamp'] = $timestamp;
return $info;
}
private function post_curl($url,$data,$agreement = 0){//curl遠程請求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
if($agreement == 0){//0 https 1 http
unset($_REQUEST['agreement']);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
}
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
4.微信支付回調
function wechat_notify(){
$postStr = @$GLOBALS["HTTP_RAW_POST_DATA"];
$getData = json_decode(json_encode(simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA)),true);
if (!empty($getData['result_code']) || $getData['result_code'] =='SUCCESS') {//如果支付成功
//你的業務邏輯
return 'SUCCESS';
}
}
轉載自:https://blog.csdn.net/qq_34629975/article/details/53609241