PHP應用如何對接微信公衆號JSAPI支付

微信支付的產品有很多,1. JSAPI支付  2. APP支付  3. Native支付  4.付款碼支付  5. H5支付。 其中基於微信公衆號開發的應用選擇“JSAPI支付“產品,其他APP支付需要“微信開放平臺”,H5支付可以在微信以後瀏覽器通過一個鏈接調起微信支付,根據自身的業務場景選擇,各產品對接方式基本一致,這裏主要講公衆號支付。

涉及平臺: 

微信商戶平臺: https://pay.weixin.qq.com/

微信公衆平臺: https://mp.weixin.qq.com/

 

微信商戶平臺的操作部分

1. 沒有賬號按要求提交資料審覈。

2. 通過後記錄mch_id,md5_key,以及下載好相關的API安全操作證書,賬戶中心。

3. 進入產品中心,開通對應的支付產品,比如“JSAPI支付”。

4. 找到“APPID授權管理”,點擊關聯更多AppID。

5. 填寫公衆號的AppID,或者小程序的AppID等。

6. 點擊開發配置的公衆號支付,添加與自己項目對應的域名及目錄。

 

 

微信公衆平臺的操作部分

1. 登錄公衆平臺,打開“公衆號設置”,記錄原始ID。

2. “功能設置”中,添加項目的業務域名,JS接口安全域名,網頁授權域名。

3. 在自己應用中通過對接公衆號需要對應的AppID,AppSecret,並把自己服務器IP爲加入白名單。

4. 應用中通過接口時,生成Tonken, 和EncodingAESKey並記錄下來。

5. 進入微信公衆平臺,打開基本配置,服務器配置,填寫應用的入口地址和上面參數,最後啓用即可。

6. 微信商戶平臺添加了該公衆號AppID授權,進入公衆後臺的“微信支付”,確認授權即可成功,詳細操作參考https://pay.weixin.qq.com/static/pay_setting/appid_protocol.shtml

7. 進入“開發者工具”->"web開發者工具",添加自己爲微信開發者,方便後面使用工具調試。

 

 

應用程序部分

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'=>'操作失敗')));
	}

}

 

公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章