微信支付的產品有不少,1. JSAPI支付 2. APP支付 3. Native支付 4.付款碼支付 5. H5支付。 其中基於微信公衆號開發的應用選擇「JSAPI支付「產品,其餘APP支付須要「微信開放平臺」,H5支付能夠在微信之後瀏覽器經過一個連接調起微信支付,根據自身的業務場景選擇,各產品對接方式基本一致,這裏主要講公衆號支付。javascript
微信商戶平臺: https://pay.weixin.qq.com/php
微信公衆平臺: https://mp.weixin.qq.com/前端
1. 沒有帳號按要求提交資料審覈。java
2. 經過後記錄mch_id,md5_key,以及下載好相關的API安全操做證書,帳戶中心。ajax
3. 進入產品中心,開通對應的支付產品,好比「JSAPI支付」。json
4. 找到「APPID受權管理」,點擊關聯更多AppID。小程序
5. 填寫公衆號的AppID,或者小程序的AppID等。後端
6. 點擊開發配置的公衆號支付,添加與本身項目對應的域名及目錄。api
1. 登陸公衆平臺,打開「公衆號設置」,記錄原始ID。瀏覽器
2. 「功能設置」中,添加項目的業務域名,JS接口安全域名,網頁受權域名。
3. 在本身應用中經過對接公衆號須要對應的AppID,AppSecret,並把本身服務器IP爲加入白名單。
4. 應用中經過接口時,生成Tonken, 和EncodingAESKey並記錄下來。
5. 進入微信公衆平臺,打開基本配置,服務器配置,填寫應用的入口地址和上面參數,最後啓用便可。
1. 前端
引入jweixin的SDK到頁面中,經過一個接口地址獲取預支付id,再使用SDK方法調起支付。
var ua = window.navigator.userAgent.toLowerCase(); if(paytype!=1 && ua.match(/MicroMessenger/i) == 'micromessenger') { // 微信公衆號支付 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{ $.ajax({ type: "GET", url: "{php echo $this->createMobileUrl('pay')}", data: {type:type,rid:rid}, dataType: "json", success: function(data) { var jsApiParameters = data; console.log('FC測試: '+jsApiParameters); WeixinJSBridge.invoke('getBrandWCPayRequest', jsApiParameters, function(res) { WeixinJSBridge.log(res.err_msg); if(res.err_msg == "get_brand_wcpay_request:ok") { window.location.reload(); } } ); } }); } }
2. 後端
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) { // 微信瀏覽器 $notify_url = $_W['siteroot'].'addons/xxxxx/wxpay.php'; // 支付後的回調地址 $model = new HcfkModel(); // 可無視 $url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; // 請求預下單接口 file_put_contents(IA_ROOT."/addons/xxxxx/trade",$trade_no); $data["appid"] = $wechat_payment['appid']; // 微信商戶平臺AppID $data["body"] = '對訂單描述一下'; $data["mch_id"] = $wechat_payment['mchid']; // 微信商戶平臺的商戶ID $data["nonce_str"] = $model->getRandChar(32); $data["notify_url"] = $notify_url; $data["out_trade_no"] = $trade_no; $data["spbill_create_ip"] = $model->get_client_ip(); $data["total_fee"] = $money*100; $data["trade_type"] = "JSAPI"; $data["openid"] = $openid; // 用戶網頁受權後的OpenID,用戶對某一公衆號是惟一 $data["sign"] = $model->getSign($data,$wechat_payment['signkey']); // 對以上請求參數進行加密,加密方式各異,大部分md5 //echo "<pre>";print_R($data);die; $xml = $model->arrayToXml($data); $response = $model->postXmlCurl($xml, $url); $ress = $model->xmlstr_to_array($response); if($ress['return_code']=='FAIL') { exit(json_encode(array('code'=>0,'msg'=>$ress['return_msg']))); } if($ress['result_code']=='FAIL'){ return $this->result(1, '操做失敗',$ress['err_code'].$ress['err_code_des']); } if($ress['return_code']=='SUCCESS'){ // 預下單成功返回支付「須要的參數」 $datas["appId"] = $wechat_payment['appid']; // appid $datas["nonceStr"] = $model->getRandChar(32); // 32位隨機串 $datas["package"] = "prepay_id=".$ress['prepay_id']; // 預支付id $datas['signType'] = "MD5"; $datas["timeStamp"] = time().''; $datas["paySign"] = $model->MakeSign($datas,$wechat_payment['signkey']); // 簽名 exit(json_encode($datas)); }else{ exit(json_encode(array('code'=>0,'msg'=>'操做失敗'))); } }
調取微信支付相關接口須要一個祕鑰,也就是對請求參數進行簽名時的一個key, 例如md5_key等等,這個支付祕鑰的設置須要再作一些操做:
1. 從新登陸進入微信支付商戶平臺
2. 找到「帳戶中心」-> 「API安全」
3. api祕鑰,設置祕鑰,而後本身自定義一個32位字符串包含大小寫字母和數字,輸入平臺支付密碼和手機驗證碼就能夠設置完成了。
公衆號