84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
闭关修行中......
微信公众号JSAPI支付 一:配置参数 申请成功后,获取接口文件, 将所有文件放入项目根目录weixin下,在WxPay.ub.config.php中填入配置账户信息; 二:设置授权 开发者中心->网页服务->网页授权获取用户基本信息->修改; “授权回调页面域名修改成你的域名地址即可,须保证网页授权已获得,不然会报redirect_uri 参数错误; 三:网页授权获取用户openid js_api_call.php 请求文件中改动(所有传给微信的参数都在入口文件中接收) $out_trade_no = $_GET['out_trade_no']; //商户系统内部订单号 32个字符内 $total_fee = $_GET['total_fee']*100; //订单总金额 单位为分,不能带小数点,所以须把价格乘以100, 不然获取prepay_id时会报错误(设置金额字段时最好设为小数点后2位) $pay_status = get_pay_status($out_trade_no);//查看订单支付状态 $return_url = get_return_url($out_trade_no); //设置支付成功后跳转页面 //使用jsapi接口 $jsApi = new JsApi_pub(); //通过code获得openid if (!isset($_GET['code'])) { //触发微信返回code码 //设置redirect_uri参数,返回code码地址,其实就是重定向到当前页面,获取用户code码参数 $url = WxPayConf_pub::JS_API_CALL_URL."?showwxpaytitle=1&out_trade_no=$out_trade_no&total_fee=$total_fee"; $url = $jsApi->createOauthUrlForCode($url); Header("Location: $url"); }else{ //获取code码,以获取openid $code = $_GET['code']; $jsApi->setCode($code); $openid = $jsApi->getOpenId(); //用户标识 } 再就是WxPayHubHelper.php文件 JsApi_pub()类下createOauthUrlForCode($redirectUrl)方法, 第二个参数 改为 $urlObj["redirect_uri"] = urlencode($redirectUrl); //对$url变量进行url编码 不然header重定向时无法获取订单号和金额 四:设置统一支付接口参数,获取prepay_id (预支付ID 微信生成的预支付 ID,用于后续接口调用中使用) 微信支付->开发配置->支付测试->测试授权目录和测试白名单添加 (支付授权目录需要精确到最细一级的目录,且在使用时,目录名称后直接加文件名,如ccc.com/weixin/) 确保你 WxPayPubHelper.php文件里 UnifiedOrder_pub 这个类的getPrepayId这个方法能正常使用 这一步的调试在 getPrepayId()内 var_dump($this->result); 就能看到错误代码; posXml这个方法后调用了createXml这个方法 function postXml() { $xml = $this->createXml(); //**在此处查看xml文件是否正常生成 include_once("log_.php"); $log = new Log_(); $log->log_result("log.txt",$xml); //** 由于打印一些xml格式的文件只显示字符长度,不显示内容。于是用log的形式写在服务器上调试 $this->response = $this->postXmlCurl($xml,$this->url,$this->curl_timeout); return $this->response; } 保证xml这个变量格式如下; 201504101658571802> 120 123334333102 参数正确,postXmlCurl才能正确提交,提交后就能得到正确的prepay_id,就能弹出支付框了五:使用jsapi调起支付 根据prepay_id生成jsapi支付参数 $jsApi->setPrepayId($prepay_id); $jsApiParameters = $jsApi->getParameters(); //调用微信JS api 支付 function jsApiCall() { WeixinJSBridge.invoke( 'getBrandWCPayRequest', , function(res){ WeixinJSBridge.log(res.err_msg); if(res.err_msg == "get_brand_wcpay_request:ok") { //支付成功后 window.location.href="" //跳转地址及订单操作,在异步页面也须处理订单,防止同步时失败 }else{ alert("支付失败"+res.err_code+res.err_desc+res.err_msg); } } ); }(每次请求callpay方法时须判断订单状态,防止重复提交) 六:通用通知接口 异步处理微信返回结果 支付完成后,notify.php中获取微信的回调 $xml = $GLOBALS['HTTP_RAW_POST_DATA']; //须验证签名,并回应微信。 if($notify->checkSign() == TRUE) //签名验证通过并更新订单状态后 $notify->setReturnParameter("return_code","SUCCESS"); //设置返回码,保证支付状态改变后才返回成功 //对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败, //微信会通过一定的策略(如30分钟共8次)定期重新发起通知, $returnXml = $notify->returnXml(); echo $returnXml;(将xml数据返回微信 当return_code为SUCCESS时,不会再通知) //当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理, 如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制, 以避免函数重入造成的数据混乱. //判断是否在微信浏览器打开 function isWeiXin(){ var ua = window.navigator.userAgent.toLowerCase(); if(ua.match(/MicroMessenger/i) == 'micromessenger'){ return true; }else{ return false; } } 步骤够详细了吧,我自己实现过,所以写了日志,结合php版本的demo 大致弄得出来了,如果对整个流程不太清楚,仔细的看完微信公众号支付接口文档,你申请微信公众号支付成功了就会有的,
微信公众号JSAPI支付
201504101658571802>
120
123334333102
一:配置参数
申请成功后,获取接口文件, 将所有文件放入项目根目录weixin下,在WxPay.ub.config.php中填入配置账户信息;
二:设置授权
开发者中心->网页服务->网页授权获取用户基本信息->修改;
“授权回调页面域名修改成你的域名地址即可,须保证网页授权已获得,不然会报redirect_uri 参数错误;
三:网页授权获取用户openid
js_api_call.php 请求文件中改动(所有传给微信的参数都在入口文件中接收)
$out_trade_no = $_GET['out_trade_no']; //商户系统内部订单号 32个字符内
$total_fee = $_GET['total_fee']*100; //订单总金额 单位为分,不能带小数点,所以须把价格乘以100,
不然获取prepay_id时会报错误(设置金额字段时最好设为小数点后2位)
$pay_status = get_pay_status($out_trade_no);//查看订单支付状态
$return_url = get_return_url($out_trade_no); //设置支付成功后跳转页面
//使用jsapi接口
$jsApi = new JsApi_pub();
//通过code获得openid
if (!isset($_GET['code'])) { //触发微信返回code码
//设置redirect_uri参数,返回code码地址,其实就是重定向到当前页面,获取用户code码参数
$url = WxPayConf_pub::JS_API_CALL_URL."?showwxpaytitle=1&out_trade_no=$out_trade_no&total_fee=$total_fee";
$url = $jsApi->createOauthUrlForCode($url);
Header("Location: $url");
}else{ //获取code码,以获取openid
$code = $_GET['code'];
$jsApi->setCode($code);
$openid = $jsApi->getOpenId(); //用户标识
}
再就是WxPayHubHelper.php文件 JsApi_pub()类下createOauthUrlForCode($redirectUrl)方法, 第二个参数
改为 $urlObj["redirect_uri"] = urlencode($redirectUrl); //对$url变量进行url编码 不然header重定向时无法获取订单号和金额
四:设置统一支付接口参数,获取prepay_id (预支付ID 微信生成的预支付 ID,用于后续接口调用中使用)
微信支付->开发配置->支付测试->测试授权目录和测试白名单添加
(支付授权目录需要精确到最细一级的目录,且在使用时,目录名称后直接加文件名,如ccc.com/weixin/)
确保你 WxPayPubHelper.php文件里 UnifiedOrder_pub 这个类的getPrepayId这个方法能正常使用
这一步的调试在 getPrepayId()内 var_dump($this->result); 就能看到错误代码;
posXml这个方法后调用了createXml这个方法
function postXml() {
$xml = $this->createXml();
//**在此处查看xml文件是否正常生成
include_once("log_.php");
$log = new Log_();
$log->log_result("log.txt",$xml);
//** 由于打印一些xml格式的文件只显示字符长度,不显示内容。于是用log的形式写在服务器上调试
$this->response = $this->postXmlCurl($xml,$this->url,$this->curl_timeout);
return $this->response;
}
保证xml这个变量格式如下;
参数正确,postXmlCurl才能正确提交,提交后就能得到正确的prepay_id,就能弹出支付框了
五:使用jsapi调起支付
根据prepay_id生成jsapi支付参数
$jsApi->setPrepayId($prepay_id);
$jsApiParameters = $jsApi->getParameters();
//调用微信JS api 支付
function jsApiCall() {
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
,
function(res){
WeixinJSBridge.log(res.err_msg);
if(res.err_msg == "get_brand_wcpay_request:ok") { //支付成功后
window.location.href="" //跳转地址及订单操作,在异步页面也须处理订单,防止同步时失败
}else{
alert("支付失败"+res.err_code+res.err_desc+res.err_msg);
}
}
);
}(每次请求callpay方法时须判断订单状态,防止重复提交)
六:通用通知接口 异步处理微信返回结果
支付完成后,notify.php中获取微信的回调
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
//须验证签名,并回应微信。
if($notify->checkSign() == TRUE) //签名验证通过并更新订单状态后
$notify->setReturnParameter("return_code","SUCCESS"); //设置返回码,保证支付状态改变后才返回成功
//对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,
//微信会通过一定的策略(如30分钟共8次)定期重新发起通知,
$returnXml = $notify->returnXml();
echo $returnXml;(将xml数据返回微信 当return_code为SUCCESS时,不会再通知)
//当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,
如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,
以避免函数重入造成的数据混乱.
//判断是否在微信浏览器打开
function isWeiXin(){
var ua = window.navigator.userAgent.toLowerCase();
if(ua.match(/MicroMessenger/i) == 'micromessenger'){
return true;
}else{
return false;
}
}
步骤够详细了吧,我自己实现过,所以写了日志,结合php版本的demo 大致弄得出来了,如果对整个流程不太清楚,仔细的看完微信公众号支付接口文档,你申请微信公众号支付成功了就会有的,