thikphp 3.2 实现微信支付(jsapi支付)流程

这里说一下微信支付(jsapi支付)流程 ,支付肯定是有订单号的、订单这一块就不多说了。

第一步:点击去支付,首先你要知道你的订单号是多少。拿着订单号,我们来处理 ,上一下代码,具体看一下

//支付选择
 

//先下载好微信支付sdk 、引入文件 ,配置就不

use Vendor\WxMPay;  //导入 用到了命名空间

// orderNo  是 我们需要支付的订单号、

public function index($orderNo=''){ 
if(!empty($orderNo)){
$data = M("order")->where(array('E_CartOrderNo'=>$orderNo))->order('ID Desc')->find();//查询出订单内容
if($this->getBrowser()=="wx"){
//**********************************************
$PayOrder = trim($data['E_CartOrderNo']);    //这里也就是我们的关联订单号
$PayMoney = floatval($data['E_OrderMoney']);  //订单的钱
$WxPMoney = $PayMoney * 100;      // 支付的钱
$order_no = time().rand(100,999).$this->Uid;   //生成支付编号
if(empty($PayPoint)) $PayPoint = $WxPMoney;
$_SESSION["GoWxWebPay_pWxName"] = 'payByWXMp'; 

vendor("WxMPay.WxPay#Api");      //将下载好的sdk 放入到 Vendor/WxMPay/   路径

vendor("WxMPay.WxPay#JsApiPay"); //

//①、获取用户openid
$tools  = new \Vendor\WxMPay\JsApiPay();  
$openId = $tools->GetOpenid();

//②、统一下单
$input = new \Vendor\WxMPay\WxPayUnifiedOrder();
$input->SetBody("微信支付");
$input->SetAttach("微信支付");
$input->SetOut_trade_no($order_no);
$input->SetTotal_fee("1");
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetGoods_tag("微信支付");
$input->SetNotify_url($this->HTTP_HOST . "/rech_notify.php");  // http//:××.com/rech_notify.php
$input->SetTrade_type("JSAPI");
$input->SetOpenid($openId);
$WxPayApi = new \Vendor\WxMPay\WxPayApi();
$order = $WxPayApi->unifiedOrder($input);

$order = $WxPayApi->unifiedOrder($input);
if($order["result_code"]=="SUCCESS" && $order["return_code"]=="SUCCESS" && !empty($order["prepay_id"])){
$jsApiParameters = $tools->GetJsApiParameters($order);
$this->assign('jsApiParameters',($jsApiParameters));
//*********************  我们将请求的加入到数据库
$m_recharge['E_CreateDate'] = time();
$m_recharge['E_UpdateDate'] = time();
$m_recharge['E_MemberID']   = $this->Uid;
$m_recharge['E_Meney']      = $PayMoney;
$m_recharge['E_Points']     = $PayPoint;
$m_recharge['E_PayType']    = "JSAPI";
$m_recharge['E_PayFlag']    = "PAY";
$m_recharge['E_OrderNo']    = $order_no;
$m_recharge['E_RelationOrder'] = $PayOrder;
$m_recharge['E_Message']    = json_encode($order);
M('member_recharge')->add($m_recharge);
$_SESSION["GoWxWebPay_Order_No"] = $PayOrder;  // session 保存订单、下面检测要用到

}
}
}
$this->assign('data',$data);
        $this->display();
}

// 前端html

// <div id="submit_order">支付</div> 

扫描二维码关注公众号,回复: 2669721 查看本文章

  <div>{$data.E_OrderMoney}</div>


$("#submit_order").click(function(){
if (typeof WeixinJSBridge == "undefined"){
  if( document.addEventListener ){
  document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
  }else if (document.attachEvent){
  document.attachEvent('WeixinJSBridgeReady', onBridgeReady); 
  document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
  }
}else{
onBridgeReady();
checkWxIMGPay(); //检测是否支付成功、调用函数判断支付成功。
}
})
function onBridgeReady(){
   WeixinJSBridge.invoke(
       'getBrandWCPayRequest', {$jsApiParameters},
       function(res){     
           if(res.err_msg == "get_brand_wcpay_request:ok" ) {}     // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。 
       }
   ); 
}        

//检测是否支付成功、

function checkWxIMGPay(){
var PayOrder = '{$data.E_CartOrderNo}';
var nows_times = (new Date().getTime()) / 1000;  
$.get("{:U('Pay/CHECK_WXPAY_FLAGS')}?PayOrder="+PayOrder+"&rtimes="+ nows_times ,function(dataObj){
if(dataObj.status==1){
// alert('跳到支付成功页面');
            window.location.href="{:U('Order/index')}"; //跳到 订单页面
}else{
setTimeout(function (){checkWxIMGPay();},3000);   ///检测一次
}
}, "json");
}


//最好就是简单粗暴的[http://serverName/xxx.php],我在跟目录下,类似于index.php,重新写了一个专门的供支付回调的入口文件payment.php,

和它对应的Application/目录下的模块(rech_notify)、控制器(Index)及方法(index):


define('BIND_MODULE','rech_notify');
define('DIR_ROOT', __DIR__);
define("Upload_PATH", "./public/File/");
define('APP_DEBUG',true);
require './ThinkPHP/ThinkPHP.php';

//define('BIND_MODULE','rech_notify');          默认是 rech_notify  模块 Index控制器中的index方法

    //回调

    public function index(){

$str_Post = $GLOBALS["HTTP_RAW_POST_DATA"];
vendor("WxMPay.WxPay#Api");
vendor("WxMPay.WxPay#Notify");

libxml_disable_entity_loader(true);
                $postObj = simplexml_load_string($str_Post, 'SimpleXMLElement', LIBXML_NOCDATA);
$postObj = json_encode($postObj);
$postObj = json_decode($postObj,true);

if ($postObj["result_code"] == 'SUCCESS' && $postObj["return_code"]=='SUCCESS'){



$out_trade_no = $postObj["out_trade_no"];

$sWhere["E_OrderNo"] = $out_trade_no;  //刚才生成的支付号
$recharge = M('member_recharge');
$info = $recharge->where($sWhere)->find();
$sUpd = $recharge->where($sWhere)->save(array("E_State"=>1,"E_UpdateDate"=>time()));//更新为支付完成状态

/*********** 这里就是修改订单状态了。。。。

}

}



//**PHP       检测当前订单是否支付成功
public function CHECK_WXPAY_FLAGS($PayOrder=""){
$WxPayOrderNo = $_SESSION["GoWxWebPay_Order_No"];
if(!empty($WxPayOrderNo)){
if($PayOrder == $WxPayOrderNo){
$info = M('order')->where(array("E_CartOrderNo"=>$PayOrder))->find();
if(intval($info["E_State"])==3){
$this->jsonReturn(1, "订单支付成功", '');
}else{
$this->jsonReturn(0, "订单已下单、支付中", '');
}
}
$this->jsonReturn(0, "支付异常、支付失败", '');
}
$this->jsonReturn(0, "支付异常、支付失败", '');
}


猜你喜欢

转载自blog.csdn.net/hua950327/article/details/78260890