微信公眾平臺(tái)的配置
設(shè)置js安全域名
如果不設(shè)置的話,在使用公眾號(hào)支付時(shí)會(huì)提示redirect_url錯(cuò)誤
設(shè)置支付目錄臭埋,和支付測(cè)試目錄
比如我發(fā)起支付的文件是 http://example.com/includes/modules/payment/wxpay/example/native.php;
那么我的支付目錄要設(shè)置成 http://example.com/includes/modules/payment/wxpay/example/
測(cè)試目錄同理畔规。
支付回調(diào)url
在支付完成后锣枝,微信會(huì)向向這個(gè)地址發(fā)送請(qǐng)求媳谁。主要用戶掃碼模式一支付好爬,比如設(shè)置成
http://example.com/includes/modules/payment/wxpay/example/notify.php味抖。
其他支付模式無需設(shè)置該url,(需要在代碼里設(shè)置)
到此微信公眾平臺(tái)的配置就完成了。
將微信支付V3 Sdk接入ecshop
獲取微信支付v3SDK
這個(gè)在微信支付文檔里很容易可以找到,然后將該SDK放進(jìn)includes/modules/payment/下
更改配置
打開wxpay/lib
編寫ecshop 支付插件
ecshop中所有的支付插件都位于includes/modules/payment/下旁瘫,在該目錄下創(chuàng)建wxpay.php文件 文件的格式可以參考該目錄下其他的文件祖凫。在該文件中創(chuàng)建wxpay類,如下:
class wxpay {
/**
* 生成支付代碼
*
* @param array $order
* 訂單信息
* @param array $payment
* 支付方式信息
*/
function get_code($order, $payment)
{
if (isMobile()){
//如果是微信瀏覽器
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) {
$button = '<div style="text-align:center"><input type="button" style="border:none; background:#e4393c; padding:5px 20px; color:#fff; line-height:20px;" onclick="window.open(\'/includes/modules/payment/wxpay/example/jsapi.php?&productId='.$order['order_sn'].'\')" value="' .$GLOBALS['_LANG']['wxpay_button']. '" /></div>';
}else{
$button = '<div style="text-align:center"><input type="button" style="border:none; background:#e4393c; padding:5px 20px; color:#fff; line-height:20px;" value="請(qǐng)使用微信瀏覽器進(jìn)入我的訂單進(jìn)行付款" /></div>';
}
}else{
$button = '<div style="text-align:center"><input type="button" style="border:none; background:#e4393c; padding:5px 20px; color:#fff; line-height:20px;" onclick="location.href=\'/includes/modules/payment/wxpay/example/native.php?&productId='.$order['order_sn'].'\'" value="' .$GLOBALS['_LANG']['wxpay_button']. '" /></div>';
}
return $button;
}
/**
* 接受通知處理訂單酬凳。這里可以寫接受到微信回調(diào)請(qǐng)求后的邏輯惠况,我是直接寫在notify.php里面了。
*
* @param undefined $log_id
* 20141125
*
*/
function respond() {
}
}
這段代碼的主要左右就是返回頁面一個(gè)帶調(diào)轉(zhuǎn)到支付頁面的按鈕宁仔。手機(jī)瀏覽器稠屠,微信瀏覽器,及PC瀏覽器返回的按鈕都是不同的翎苫。手機(jī)非微信瀏覽器現(xiàn)在還沒辦法用微信支付权埠。
PC端掃碼支付模式二
點(diǎn)擊按鈕跳轉(zhuǎn)到wxpay/example/native.php 這里面有模式一和模式二,這里選擇模式二煎谍,到這里按照微信提供的文檔攘蔽,應(yīng)該就比較容易解決了。
回調(diào) notify.php
微信發(fā)的請(qǐng)求會(huì)由該文件處理呐粘。我的處理邏輯如下:
//重寫回調(diào)處理函數(shù)
public function NotifyProcess($data, &$msg)
{
$notfiyOutput = array();
if(!array_key_exists("transaction_id", $data)){
$msg = "輸入?yún)?shù)不正確";
return false;
}
//查詢訂單满俗,判斷訂單真實(shí)性
if(!$this->Queryorder($data["transaction_id"])){
$msg = "訂單查詢失敗";
return false;
}
$total_fee=$data['total_fee']/100;
//用戶自定義邏輯转捕,修改訂單狀態(tài)
//檢查支付的金額是否與訂單相符
$pay_log_id=get_order_id_by_sn($data['out_trade_no']);
if(!check_money($pay_log_id,$total_fee)){
$msg = "支付金額與訂單金額不符";
return false;
}
$user_id=getUserId($data['out_trade_no']);
order_paid($pay_log_id, 2,"貨款已微信支付");
$order_id=getOrderIdBySn($data['out_trade_no']);
Log::INFO("訂單id:".$order_id."logs_id:".$pay_log_id);
$log_msg="用戶". $user_id. "已經(jīng)為訂單id:".$order_id."sn:" .$data['out_trade_no']. "支付了". $total_fee ." 元,并將該訂單狀態(tài)改為已經(jīng)支付";
Log::INFO($log_msg);
if ($msg!='OK') {
Log::ERROR("用戶".$user_id."支付訂單:".$data['out_trade_no']."時(shí)出錯(cuò),錯(cuò)誤信息為".$msg);
}
return true;
}
在支付頁面在支付成功后將二維碼切換成成功提示消息
這里可以設(shè)置個(gè)定時(shí)器每隔幾秒就去查詢訂單(微信支付提供了訂單查詢借口)唆垃,等支付成功后就提示用戶