1.調(diào)用前準(zhǔn)備
1)查看商戶平臺(tái) appid,key,secret,mchid(商戶號(hào));
獲取地址:https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=2005451881&lang=zh_CN
2)在商戶平臺(tái)將前臺(tái)調(diào)用微信支付的頁面地址加入商戶平臺(tái)中(否則報(bào)url未注冊(cè)錯(cuò)誤)
? ? 如http://www.baidu.com/test/demo.html
? ? 則要將http://www.baidu.com/test/ ?加入到商戶平臺(tái)后臺(tái)url注冊(cè)中
3)下載商戶平臺(tái)支付證書,在api證書下載中下載
? ? 登錄微信支付商戶平臺(tái),點(diǎn)擊【賬戶中心】->【賬戶設(shè)置】->【API安全】->【下載證書】中,下載及設(shè)置;

? ? 除了apiclient_cert.p12,apiclient_cert.pem,apiclient_key.pem,還有rootca.pem要加入證書中
4)引入官方方法文件


大致目錄結(jié)構(gòu)為:

2.配置WxPay.Config.php
/**
*? 配置賬號(hào)信息
*/
class WxPayConfig
{
? //=======【基本信息設(shè)置】=====================================
//
/**
? ? * TODO: 修改這里配置為您自己申請(qǐng)的商戶信息
? ? * 微信公眾號(hào)信息配置
*
* APPID:綁定支付的APPID(必須配置,開戶郵件中可查看)
*
* MCHID:商戶號(hào)(必須配置,開戶郵件中可查看)
*
* KEY:商戶支付密鑰,參考開戶郵件設(shè)置(必須配置,登錄商戶平臺(tái)自行設(shè)置)
* 設(shè)置地址:https://pay.weixin.qq.com/index.php/account/api_cert
*
* APPSECRET:公眾帳號(hào)secert(僅JSAPI支付的時(shí)候需要配置, 登錄公眾平臺(tái),進(jìn)入開發(fā)者中心可設(shè)置),
* 獲取地址:https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=2005451881&lang=zh_CN
? ? * @var string
*/
? const APPID = appid;
? const MCHID = mchid;
? const KEY = key;
? const APPSECRET = secret;
? //=======【證書路徑設(shè)置】=====================================
/**
? ? * TODO:設(shè)置商戶證書路徑
? ? * 證書路徑,注意應(yīng)該填寫絕對(duì)路徑(僅退款、撤銷訂單時(shí)需要,可登錄商戶平臺(tái)下載,
* API證書下載地址:https://pay.weixin.qq.com/index.php/account/api_cert,下載之前需要安裝商戶操作證書)
? ? * @var path
*/
? const SSLCERT_PATH = '../cert/apiclient_cert.pem';
? const SSLKEY_PATH = '../cert/apiclient_key.pem';
? //=======【curl代理設(shè)置】===================================
/**
? ? * TODO:這里設(shè)置代理機(jī)器,只有需要代理的時(shí)候才設(shè)置,不需要代理,請(qǐng)?jiān)O(shè)置為0.0.0.0和0
? ? * 本例程通過curl使用HTTP POST方法,此處可修改代理服務(wù)器,
* 默認(rèn)CURL_PROXY_HOST=0.0.0.0和CURL_PROXY_PORT=0,此時(shí)不開啟代理(如有需要才設(shè)置)
? ? * @var unknown_type
*/
? const CURL_PROXY_HOST = "0.0.0.0";//"10.152.18.220";
? const CURL_PROXY_PORT = 0;//8080;
//=======【上報(bào)信息配置】===================================
/**
? ? * TODO:接口調(diào)用上報(bào)等級(jí),默認(rèn)緊錯(cuò)誤上報(bào)(注意:上報(bào)超時(shí)間為【1s】,上報(bào)無論成敗【永不拋出異?!浚?/p>
? ? * 不會(huì)影響接口調(diào)用流程),開啟上報(bào)之后,方便微信監(jiān)控請(qǐng)求調(diào)用的質(zhì)量,建議至少
* 開啟錯(cuò)誤上報(bào)。
* 上報(bào)等級(jí),0.關(guān)閉上報(bào); 1.僅錯(cuò)誤出錯(cuò)上報(bào); 2.全量上報(bào)
? ? * @var int
*/
? const REPORT_LEVENL = 1;
}
3.示例代碼
//支付方式
$payData['user_id']=$_SESSION['uid'];//用戶id 此處保存在session中,其他自取
//0余額 1微信公眾號(hào) 2微信app 3支付寶app
$payData['type']=1;
//0:消費(fèi) 1:充值
$payData["plus_minus"] = 0;
$payData["sum"] = (金額);
$payData["order_type"] = $_REQUEST['order_type'];//支付狀態(tài)
$payData["order_id"] = $id;
$payData["order_num"] = time() . rand(100, 1000);//支付訂單號(hào),隨機(jī)生成
if ($_REQUEST['order_type'] == 1) {
? ? $payData["detail"] = "活動(dòng)報(bào)名充值";
} else if ($_REQUEST['order_type'] == 2) {
? ? $payData["detail"] = "余額充值";
}
//0:未支付 1:已支付
$payData['status']=0;
vendor('WeiXinPay.JSAPI');//此處為官方接口文件目錄引用方法
$tools = new JsApiPay();
//$openid = $tools->GetOpenid();
$openid = $userinfo["openid"];//獲取用戶openid 自取
$Out_trade_no = $payData["order_num"];
$Body = 'incubator';
$Total_fee = $_REQUEST['charge']*100; //1=0.01元 所以*100
//次數(shù)order_type 表示支付狀態(tài) 如果為1 則添加數(shù)據(jù)庫操作
if($_REQUEST['order_type'] == 1){
//....將支付數(shù)據(jù)信息(如活動(dòng)報(bào)名成功信息)加入數(shù)據(jù)庫
}else{
? ? ? ? ?$input = new WxPayUnifiedOrder();
? ? ? ? ? ? ? $input->SetBody($Body);
? ? ? ? ? ? ? $input->SetAttach("test");
? ? ? ? ? ? ? $input->SetOut_trade_no($Out_trade_no);
//? ? ? ? $input->SetOut_trade_no(WxPayConfig::MCHID . date("YmdHis"));
? ? ? ? ? ? ? $input->SetTotal_fee($Total_fee);
? ? ? ? ? ? ? $input->SetTime_start(date("YmdHis"));
? ? ? ? ? ? ? $input->SetTime_expire(date("YmdHis", time() + 600));
//發(fā)送Notify
$input->SetNotify_url("http://yf.haoapp123.com/fuhuaqi2/api.php/incubator/wechatPayNotify");
? ? ? ? ? ? ? $input->SetTrade_type("JSAPI");
? ? ? ? ? ? ? $input->SetOpenid($openid);
? ? ? ? ? ? ? //? ? ? ? $order = WxPayApi::unifiedOrder($input);
//動(dòng)態(tài)獲取方法
// ?$incubatorInfo = M('regcode')->where("enc_code='".$_REQUEST['bm']."'")->find();
//? ? ? ? ? ? $bm=$_REQUEST['bm'];
?// ? ? ? ? ? ?$appid=$incubatorInfo['appid'];
?// ? ? ? ? ? ?$mchid=$incubatorInfo['mchid'];
?// ? ? ? ? ? ?$order = WxPayApi::unifiedOrder($input,$appid,$mchid);//如要?jiǎng)討B(tài)獲取則需修改?WxPayApi方法使其多加兩個(gè)參數(shù)appid,mchid
//一般將appid,mchid配置在配置文件中,WxPayApi會(huì)自動(dòng)加載配置文件中的appid和mchid
?$order = WxPayApi::unifiedOrder($input);
//? ? dump($order['prepay_id']);
? ? ? ? ? ? //獲取返回值,輸出到前臺(tái)的data
? ? ? ? ? ? ? $res = $tools->GetJsApiParameters($order);
? ? ? ? ? ? ? $result["data"] = json_decode($res);
? ? ? ? ? ? ? $result["order_num"] = $Out_trade_no;
// 根據(jù)上行取得的支付參數(shù)請(qǐng)求支付即可
//? ? ? ? dump($data);
? ? ? ? ? ? ? $payData["prepay_id"] = $order['prepay_id'];
? ? ? ? ? ? ? $payData['create_time'] = date("Y-m-d H:i:s");
? ? ? ? ? ? ? M('user_balance_pay')->add($payData);//user_balance_pay表為用戶信息表儲(chǔ)存要保存的信息
? ? ? ? ? ? ? $result['result'] = '1';
? ? ? ? ? ? ? $result['result_text'] = 'success';
//? ? ? ? ? ? $result['bm']=$bm;
? ? ? ? ? ? ? echo json_encode($result);
? ? ? ? ? ? ? return;
}
wechatPayNotify ?
function wechatPayNotify()
{
? ? ? ? $xml = $GLOBALS['HTTP_RAW_POST_DATA'];
? ? ? ? if (!empty($xml)) {
? ? ? ? ? ? $json = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)));
? ? ? ? ? ? $order_number = $json->out_trade_no;
? ? ? ? ? ? //? ? ? ? $data["prepay_id"] = $order_number;
//? ? ? ? M('user_balance_pay')->add($data);
? ? ? ? ? ? $appPay = M('user_balance_pay')->where('type = 1 and order_num = ' . $order_number)->find();
? ? ? ? ? ? if (!empty($appPay)) {
? ? ? ? ? ? ? ? $appPay["status"] = 1;
? ? ? ? ? ? ? ? $appPay['update_time'] = date("Y-m-d H:i:s");
? ? ? ? ? ? ? ? //修改用戶支付狀態(tài)
? ? ? ? ? ? ? ? M('user_balance_pay')->save($appPay);
? ? ? ? ? ? ? ? if ($appPay["order_type"] == 1) {
? ? ? ? ? ? ? ? ? ? $this->payResultToGetMeetingroomKey($appPay["order_id"]);
? ? ? ? ? ? ? ? ? ? $theOrder = M('view_mroom_apply')->where('id=' . $appPay["order_id"])->find();
? ? ? ? ? ? ? ? ? ? $this->sendMessage($theOrder["openid"],
? ? ? ? ? ? ? ? ? ? ? ? $theOrder["roomnumber"],
? ? ? ? ? ? ? ? ? ? ? ? substr($theOrder["start_time"], 0, 16) . "-" . substr($theOrder["end_time"], 11, 5),
? ? ? ? ? ? ? ? ? ? ? ? $theOrder["enterprise_name"],
? ? ? ? ? ? ? ? ? ? ? ? $theOrder["name"],
? ? ? ? ? ? ? ? ? ? ? ? $theOrder["mobile"]);
}
}
? ? ? ? ? ? $data["result"] = "1";
? ? ? ? ? ? $data["result_text"] = "success";
//? ? ? ? ? ? echo json_encode($data);
? ? ? ? ? ? echo "";
? ? ? ? ? ? return;
? ? ? ? }else {
? ? ? ? ? ? $data["result"] = "0";
? ? ? ? ? ? $data["result_text"] = "fail";
//? ? ? ? ? ? echo json_encode($data);
? ? ? ? ? ? return;
}
? ? }
4.常遇錯(cuò)誤
1.url未注冊(cè)
未將發(fā)起微信支付頁面加入商戶平臺(tái)url注冊(cè)中
2.appid參數(shù)異常
(1)WxPay.Config.php中appid設(shè)置錯(cuò)誤,或key錯(cuò)誤
(2)雖然微信支付并沒有涉及key的操作,但是appid需要key進(jìn)行解析,所以配置文件中四個(gè)參數(shù)必須都填上
(3)證書錯(cuò)誤,重新下載
(4)WxPay.Config.php引用證書路徑錯(cuò)誤
5.其他
暫無..待改進(jìn)
1.存儲(chǔ)用戶支付信息目錄(僅作參看)

2..給公眾號(hào)用戶推送模版消息需要服務(wù)器ip加入公眾號(hào)請(qǐng)求白名單,不知道對(duì)微信公眾號(hào)支付有沒有影響,暫議.
? ? ? ? ? ? ? SDK下載地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1