thikphp 3.2 实现微信支付(jsapi支付)流程
2017-10-17 15:17
507 查看
这里说一下微信支付(jsapi支付)流程 ,支付肯定是有订单号的、订单这一块就不多说了。
第一步:点击去支付,首先你要知道你的订单号是多少。拿着订单号,我们来处理 ,上一下代码,具体看一下
//支付选择
//先下载好微信支付sdk 、引入文件 ,配置就不
[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, "支付异常、支付失败", '');
}
第一步:点击去支付,首先你要知道你的订单号是多少。拿着订单号,我们来处理 ,上一下代码,具体看一下
//支付选择
//先下载好微信支付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, "支付异常、支付失败", '');
}
相关文章推荐
- PHP实现微信支付(jsapi支付)流程
- PHP实现微信支付(jsapi支付)流程
- PHP实现微信支付(jsapi支付)流程
- PHP实现微信支付(jsapi支付)和退款(无需集成支付SDK)流程教程详解
- PHP实现微信支付(jsapi支付)流程步骤详解
- ThinkPHP中实现微信支付(jsapi支付)流程
- [置顶] PHP实现微信支付(jsapi支付)和退款(无需集成支付SDK)
- ThinkPHP实现微信支付(jsapi支付)流程教程详解
- ThinkPHP中实现微信支付(jsapi支付)流程
- ThinkPHP中实现微信支付(jsapi支付)流程
- Dcloud中mui 微信支付和支付宝支付接口完美实现付款代码(PHP支付宝demo)
- 微信支付开发 c# SDK JSAPI支付开发的流程和微信大坑
- php微信支付(仅Jsapi支付)详细步骤.----仅适合第一次做微信开发的程序员
- Dcloud中mui 微信支付和支付宝支付接口完美实现付款代码(PHP支付宝demo)
- 公众号支付开发demo,php开发微信支付接口流程
- 微信支付统一下单及调起支付接口的php接口实现 (可以用于app集成)
- 使用php的ci框架,实现微信支付(jsapi方式+完整代码)
- 转载【微信支付】jsapi支付之传参问题(使用微信官方SDK之PHP版本) V3之WxpayPubHelper 亲测有效,V3WxpayAPI_php_v3.zip版未测试,理论上也是一样的。
- Dcloud中mui 微信支付和支付宝支付接口完美实现付款代码(PHP支付宝demo)