您的位置:首页 > 移动开发 > 微信开发

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

2017-10-17 15:17 507 查看
这里说一下微信支付(jsapi支付)流程 ,支付肯定是有订单号的、订单这一块就不多说了。

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

//支付选择
 



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



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


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

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']);  //订单的钱<
4000
br />$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//:×[b]×.com/[b]rech_notify.php
[/b]
$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();

}
[/b]

//
前端html


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

  <div>{$data.[b]E_OrderMoney}</div>[/b]

$("#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, "支付异常、支付失败", '');
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: