微信公众号支付

现在微信的圈子越来越大,所以公众号支付是一个再正常不过的功能了,微信公众号支付的一些申请什么的就不说了。

我们先分析一些我们的支付流程 :用户准备支付,我们后台进行订单号等一系列的参数生成 并创给微信后台。微信会但会一些数据,你再将这个数据渲染到一个支付页面。点击支付掉起支付窗口

代码:

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里面进行配置

写的不好,请多指教

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值