因公司需求要做微信支付功能,有幸踩了微信的坑,在此简单记录一下。
微信支付档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1
SDK示例下载:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
1,微信支付要有通过认证的服务号,商户号。具体申请是产品申请的 就不管了
服务号下面要设置网页授权域名 位置:公众号设置 -> 功能设置->网页授权域名(填写域名就可以了 不用带http://这些)
2,商户号下面要设置授权目录
注意2点:a,目录最后要用 " / " 结束
b, 这个配置不支持tp 的 pathinfo模式(我做的时候 index.php?m=Home&c=Tickets&a=index?m=Home&c=Tickets&a=index?code='fhdjhau8884455' 会是这样跟code 这样无法获取),所以要在tp根目录新建一个支付入口文件
复制入口文件index.php 修改成payment.php 在里面加上
$_GET['m']='Home';
$_GET['c']='Wxpay';
$_GET['a']='payment';
跳转到你的程序控制器就可以了。
3,代码部分是从上面sdk 示例下载的 最开始在网上看了好几个人的博客下面贴两个链接可以参考一下
https://blog.csdn.net/u014391889/article/details/83147307 tp3.2 ajax 方法做的
https://blog.csdn.net/aaron_wang0810/article/details/83111039 ThinkPHP5集成微信JSAPI支付
思路都大同小异配置完成之后 主要是获取 appid 这些信息 最开始是想用ajax 来获取并配置这些信息,但是在和微信授权交互的时候报跨域问题时间问题就换了直接赋值过来了{$data}
前端是通过点击支付来唤起微信接口
$(function(){
$("#payment").click(function(){
var result={$data};
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(result);
}
})
function jsApiCall(result)
{
WeixinJSBridge.invoke('getBrandWCPayRequest', {
"appId":result.appId, //公众号名称,由商户传入
"timeStamp":result.timeStamp, //时间戳,自1970年以来的秒数
"nonceStr":result.nonceStr, //随机串
"package":result.package,
"signType":result.signType, //微信签名方式:
"paySign":result.paySign //微信签名
},
function(res){
WeixinJSBridge.log(res.err_msg);
if (res.err_msg == "get_brand_wcpay_request:ok") {
window.location.href="https://dronewoess.cn/index.php?m=home&c=Wxindex&a=success";
// 支付成功可以进行页面跳转
} else if (res.err_msg == "get_brand_wcpay_request:cancel") {
alert("用户取消支付!");
} else {
alert("支付失败!");
}
});
}
})
后端就直接用的示例稍微修改了一下 这里我传了两个参数进来 $out_trade_no(订单号不可重复),$totle_price(价格),在控制器直接调用方法 然后assign 到模板就可以了
//微信页面唤醒支付
function payJsapi($out_trade_no,$totle_price){
Vendor('Util.WxPay.lib.WxPay',COMMON_PATH, '.Api.php');
Vendor('Util.WxPay.tools.WxPay',COMMON_PATH,'.JsApiPay.php');
Vendor('Util.WxPay.tools.WxPay',COMMON_PATH,'.Config.php');
//①、获取用户openid
$tools = new JsApiPay();
$openId = $tools->GetOpenid();
//②、统一下单
$input = new WxPayUnifiedOrder();
$input->SetBody("无人机大会报名费用");
$input->SetAttach("dronewxpay");
//$input->SetOut_trade_no("sdkphp".date("YmdHis"));
$input->SetOut_trade_no($out_trade_no);
$input->SetTotal_fee('1');
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire();
//$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetGoods_tag("droneworldcongress-wx");
$input->SetNotify_url(C('ZHIFU.weixin'));
$input->SetTrade_type("JSAPI");
$input->SetOpenid($openId);
$config = new WxPayConfig();
$order = WxPayApi::unifiedOrder($config, $input);
$jsApiParameters = $tools->GetJsApiParameters($order);
return $jsApiParameters;
}
到此就是我这次微信支付JSAPI的过程了, 公司需求只是做了支付功能 ,付款成功以后在上面js 会自动返回状态,我直接做了跳转.
总结:做微信支付功能坑是挺多,一会获取不到openid 一会又是跨域问题,授权目录问题等等问 ,但是只要耐心的研究研究 多查查资料多看看大神怎么做的,慢慢摸索,也总是会做出来的.