ThinkPHP5微信手機支付
阿新 • • 發佈:2018-12-12
- 下載demo放置在vendor目錄下
- 配置好config
- 微信商戶平臺配置到支付目錄(一定是目錄,不是方法)
js調起支付方法
//呼叫微信JS api 支付 function jsApiCall() { var item_id = {$payinfo['item_id']}; var data={$data}; WeixinJSBridge.invoke( 'getBrandWCPayRequest', data, function(res){ WeixinJSBridge.log(res.err_msg); if(res.err_msg == "get_brand_wcpay_request:ok"){ alert("支付成功!"); window.location.href="";//支付成功,發貨處理方法 }else if(res.err_msg == "get_brand_wcpay_request:cancel"){ alert("使用者取消支付!"); window.location.href=""; //支付取消處理方法 }else{ alert("支付失敗!"); window.location.href="";//支付失敗處理方法 } } ); } function callpay() { if (typeof WeixinJSBridge == "undefined"){ if( document.addEventListener ){ document.addEventListener('WeixinJSBridgeReady', jsApiCall, false); }else if (document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', jsApiCall); document.attachEvent('onWeixinJSBridgeReady', jsApiCall); } }else{ jsApiCall(); } }
PHP支付類
<?php namespace app\*\controller; use think\Controller; use think\Session; use app\*\model\ConfigCommodityInfo; use app\*\model\RecordOrder; class Pay extends Controller { public function _initialize() { parent::_initialize(); $this->info = new ConfigCommodityInfo(); $this->order = new RecordOrder(); } //統一下單 調取微信支付介面 public function pay($item_id,$order_sn,$openid) { vendor('pay.WxPayApi') ; vendor('pay.WxPayJsApiPay'); $tools = new \JsApiPay(); $order = new \WxPayApi(); $appid = '*'; $payinfo = $this->info->selCommodityInfoId($item_id); define("PARTERKEY",$payinfo['item_id']); $input = new \WxPayUnifiedOrder(); $input->SetBody($payinfo['item_title']); //商品名稱 $input->SetAttach('$attach'); //附加引數,可填可不填,填寫的話,裡邊字串不能出現空格 $input->SetOut_trade_no($order_sn); //訂單號 $input->SetTotal_fee($payinfo['unit_price'] *100); //支付金額,單位:分換成元*100 $input->SetTime_start(date("YmdHis", time() )); //支付發起時間 $input->SetTime_expire(date("YmdHis", time() + 6000));//支付超時 $input->SetGoods_tag("test3"); $input->SetNotify_url("/agent/coupon/notify"); $input->SetTrade_type("JSAPI"); //支付型別 $input->SetOpenid($openid); //使用者openID $input->SetAppid($appid); $order = $order->unifiedOrder($input); //統一下單 $jsApiParameters = $tools->GetJsApiParameters($order); return $jsApiParameters; } public function imstr($field){ $str = ''; foreach ($field as $key) { $str .= "`v`."."`".$key."`,"; } return trim($str,','); } //微信支付回撥驗證 public function notify(){ $xml = $GLOBALS['HTTP_RAW_POST_DATA']; $data = xmlToArray($xml); // 儲存微信伺服器返回的簽名sign $data_sign = $data['sign']; // sign不參與簽名演算法 unset($data['sign']); $sign = $this->makeSign($data); // 判斷簽名是否正確 判斷支付狀態 if ( ($sign===$data_sign) && ($data['return_code']=='SUCCESS') && ($data['result_code']=='SUCCESS') ) { $result = $data; file_put_contents('./Api/wxpay/logs/log1.txt',$xml,FILE_APPEND); //獲取伺服器返回的資料 $order_sn = $data['out_trade_no']; //訂單單號 $order_id = $data['attach']; //附加引數,選擇傳遞訂單ID $openid = $data['openid']; //付款人openID $total_fee = $data['total_fee']; //付款金額 //更新資料庫 $this->updateDB($order_id,$order_sn,$openid,$total_fee); }else{ $result = false; } // 返回狀態給微信伺服器 if ($result) { $str='<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>'; }else{ $str='<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[簽名失敗]]></return_msg></xml>'; } echo $str; return $result; } /** * 生成簽名 * @return 簽名,本函式不覆蓋sign成員變數 */ protected function makeSign($data){ //獲取微信支付祕鑰 vendor('pay.WxPayApi') ; $key = \WxPayConfig::KEY; // 去空 $data=array_filter($data); //簽名步驟一:按字典序排序引數 ksort($data); $string_a=http_build_query($data); $string_a=urldecode($string_a); //簽名步驟二:在string後加入KEY //$config=$this->config; $string_sign_temp=$string_a."&key=".$key; //簽名步驟三:MD5加密 $sign = md5($string_sign_temp); // 簽名步驟四:所有字元轉為大寫 $result=strtoupper($sign); return $result; } }
//資料庫訂單生成一級微信訂單生成 public function buy_order() { $item_id = input('item_id'); $payinfo = $this->info->selCommodityInfoId($item_id); $payinfo['order_create_time'] = date('Y-m-d H:i:s',time()) ; $order_sn = time() . rand(1000,9999); $payinfo['order_id'] = $order_sn; $openid = Session::get('front_pay_openid'); $res['order_id'] = $order_sn; $res['goods_id'] = $payinfo['item_id']; $res['user_id'] = Session::get('user_id'); $res['goods_total_price'] = $payinfo['unit_price']; $res['order_create_time'] = time().'000'; $this->order->addOrder($res);//資料庫生成訂單 $this->assign('payinfo',$payinfo); $data = $this->pay->get_paysign($item_id,$order_sn,$openid);//微信支付訂單生成(商品ID,訂單號,微信使用者openid) $this->assign('data',$data); return $this->fetch(); }
微信使用者openid獲取方法
public function get_openid()
{
vendor('pay.WxPayApi') ;
vendor('pay.WxPayJsApiPay');
if(empty(Session::get('front_pay_openid'))){
$pay = new \JsApiPay();
$openid = $pay->GetOpenid();
Session::set('front_pay_openid',$openid);
}
}