现在微信的圈子越来越大,所以公众号支付是一个再正常不过的功能了,微信公众号支付的一些申请什么的就不说了。
我们先分析一些我们的支付流程 :用户准备支付,我们后台进行订单号等一系列的参数生成 并创给微信后台。微信会但会一些数据,你再将这个数据渲染到一个支付页面。点击支付掉起支付窗口
代码:
1)生成需要数据的后台方法
// 点击支付 [唤起支付] 【需要修改 已经改变了】
public function goPay(){
// 业务逻辑
$resOrderInfo = array();
require_once(APP_PATH."Business/wxPay/wxPay.php");
$sc=new \wxPay();
$resWp = $sc->jsapiPay($resOrderInfo);
$this->assign("jsApiParameters", $resWp);
$this->display("Mlease/wxjsPay");
}
2)wxPay类下面的jsapiPay 方法
<?php
/*
* 微信支付主业务模块
*
* author:HK
*/
ini_set('date.timezone', 'Asia/Shanghai');
require_once './nuoSystem/Plugin/wxPay/lib/WxPay.Api.php';
require_once './nuoSystem/Plugin/wxPay/example/WxPay.JsApiPay.php';
require_once './nuoSystem/Plugin/wxPay/example/log.php';
class wxPay {
//微信JSAPI支付
public function jsapiPay($_data) {
$data["userId"] = isset($_data["userid"]) ? $_data["userid"] : 0;
$data["orderNumber"] = isset($_data["ordernumber"]) ? $_data["ordernumber"] : 0;
$data["orderId"] = isset($_data["orderid"]) ? $_data["orderid"] : 0;
$data["totalLastMoney"] = isset($_data["totallastmoney"]) ? sprintf("%0.2f", $_data["totallastmoney"]) : 0.00; //充值金额
//生成JSAPI需要的微信支付信息
$tools = new JsApiPay();
$openId = $tools->GetOpenid();
$input = new WxPayUnifiedOrder();
$input->SetBody("支付");
$input->SetAttach("支付");
$input->SetOut_trade_no($data["orderNumber"]);
$input->SetTotal_fee(100 * $data["totalLastMoney"]);
// $input->SetTotal_fee("1");
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetGoods_tag("支付");
$input->SetNotify_url('http://'.$_SERVER["HTTP_HOST"]."/Wxpay/wxpayNotify");
$input->SetTrade_type("JSAPI");
$input->SetOpenid($openId);
$order = WxPayApi::unifiedOrder($input);
$jsApiParameters = $tools->GetJsApiParameters($order);
return $jsApiParameters;
}
}
3) 返回的页面渲染到 wxjsPay 页面
<!DOCTYPE html>
<html>
<head>
<title>确认支付</title>
</head>
<script type="text/javascript">
//调用微信JS api 支付
function jsApiCall()
{
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
<?php echo $jsApiParameters; ?>,
function(res){
alert(res.err_msg);
WeixinJSBridge.log(res.err_msg);
if(res.err_msg == "get_brand_wcpay_request:ok" ){
location.href="/Personal/morder.html";
}
}
);
}
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();
}
}
</script>
<body>
<div class="header">
<a id="goback" href="javascript:void(0);"><img src="__PUBLIC__/WebMove/img/payback.png"></a>
<span style="font-size: 1.28rem;">猛犸极限</span>
<em><a href="javascript:void(0);" ></a></em>
</div>
<div style="height: 2.8rem;"></div>
<section class="main">
<!-- 确认缴费[[ -->
<form method="post" action="#" role="form" class="confirm">
<fieldset>
<div class="info-area">
<dl class="totle">
<dt class="totle-title">
结算
</dt>
<dd class="totle-num">
<strong>¥<?php echo $userReMoney?></strong>
</dd>
</dl>
</div>
<div class="info-btn">
<a class="btn btn-green" id="pay_btn" onclick="callpay()">立即支付</a>
</div>
</fieldset>
</form>
<div class="wxpay-logo">
</div>
</section>
</body>
<script type="text/javascript">
$(function(){
pushHistory();
window.addEventListener("popstate", function(e) {
// alert("我监听到了浏览器的返回按钮事件啦");//根据自己的需求实现自己的功能
if(confirm('确认取消支付吗?')){
location.href='/Personal/morder.html';
}else{
pushHistory();
}
}, false);
function pushHistory() {
var state = {
title: "title",
url: "#"
};
window.history.pushState(state, "title", "#");
}
});
$("#goback").click(function(){
if(confirm('确认取消支付吗?')){
location.href='/Personal/morder.html';
}else{
pushHistory();
}
});
</script>
</html>
然后就是点击支付了
***WxPay.Api.php;WxPay.JsApiPay.php';log.php'; 需要下载微信的sdk使用
微信的异步回调
//微信回调验证签名
public function wxpayNotify() {
$xmlInfo = $GLOBALS['HTTP_RAW_POST_DATA'];
//解析xml
$arrayInfo = $this->xmlToArray($xmlInfo);
if ($arrayInfo['return_code'] == "SUCCESS") {
if ($return_msg != null) {
echo $this->returnInfo("FAIL", "签名失败");
} else {
$wxSign = $arrayInfo['sign'];
unset($arrayInfo['sign']);
$arrayInfo['appid'] = "wxf7f0ef3873cd1146";
$arrayInfo['mch_id'] = "1392343202";
$sign = $this->getSign($arrayInfo); //生成签名
if ($this->checkSign($wxSign, $sign)) {
//处理业务逻辑
$data["orderNumber"] = $arrayInfo['out_trade_no'];
$data["rechargeChongId"] = $arrayInfo['transaction_id']; //微信交易号
$data["rechargeContent"] = $arrayInfo['result_code']; //交易返回状态
$data["rechargeMoney"] = $arrayInfo['total_fee'];
//修改当前支付订单的状态
$resCallBackController = new CallbackController();
$resCallBackController -> backThink($data); // 调用事物
echo $this->returnInfo("SUCCESS", "OK");
} else {
echo $this->returnInfo("FAIL", "签名失败");
}
}
} else {
echo $this->returnInfo("FAIL", "签名失败");
}
}
微信的配置在下载的sdk里面进行配置
写的不好,请多指教