使用easywechat完成微信支付
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用easywechat完成微信支付相关的知识,希望对你有一定的参考价值。
参考技术A 由于工作需要,项目中要实现微信支付功能。项目开发语言为php,框架为Laravel 5.41,首先安装easywechat组件
composer require “overtrue/laravel-wechat:~3.0”
2,创建控制器WechatController
微信公众号支付
作为一个新手,第一次需要完成线上支付,我选择使用demo中的例子,在tp5 框架中直接加载要使用的类。
然后就是完成支付需要的步骤:
1 获取位置支付所需要的配置信息
const APPID = ‘你的appid‘; const MCHID = ‘商户号‘; const KEY = ‘商户支付密钥‘; const APPSECRET = ‘公众帐号secert‘;
如果没有正式账号 可以使用测试账号:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
2 获取openid
//加载必要的类
$tools = new \JsApiPay(); $openId = $tools->GetOpenid();
这里获取还是有点不太明白,我在网上查了好多,都说是在关注公众号的时候把这个openid 存入数据库,可是在这里我使用的手机号注册,怎么样才能把自己账号在关注事件获取到openid时绑定在一起存储到数据库,这里不太明白,所以我就是在进入公众号页面时调用一次,在登录后获取openid 在存入数据库中,和用户绑定在一起
3 调用统一下单接口 生成订单
这里就是需要在构建订单数据,比如说,想要买图书,构建购买图书的订单数据,订单ID 图书金额等
然后就是调用接口,我这里还是使用demo中的类,加载必要类
//②、统一下单 $input = new \WxPayUnifiedOrder(); $input->SetBody($body); $input->SetAttach($attach); $input->SetOut_trade_no($trade_no); $input->SetTotal_fee($total*100); $input->SetTime_start($start); $input->SetTime_expire($expire); // $input->SetGoods_tag("test"); $input->SetNotify_url("http://blog.upwqy.com/wxpay/example/notify.php"); $input->SetTrade_type("JSAPI"); $input->SetOpenid($openId); $order = \WxPayApi::unifiedOrder($input);
$jsApiParameters = $tools->GetJsApiParameters($order);
ps:统一下单这里 支付金额不能是sting类型的 整型和浮点型的数据才可以
这里面的参数查看一下官方文档就知道什么意思了。这里就不赘述了。
统一下单接口:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
4 H5页面调起微信支付api
下面是官方文档给的方法:
function onBridgeReady(){ WeixinJSBridge.invoke( ‘getBrandWCPayRequest‘,
//这里的数据就是统一下单步骤中返回的 $jsApiParameters {
"appId":"wx2421b1c4370ec43b", //公众号名称,由商户传入 "timeStamp":"1395712654", //时间戳,自1970年以来的秒数 "nonceStr":"e61463f8efa94090b1f366cccfbbb444", //随机串 "package":"prepay_id=u802345jgfjsdfgsdg888", "signType":"MD5", //微信签名方式: "paySign":"70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名 },
function(res){ if(res.err_msg == "get_brand_wcpay_request:ok" ) {} // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。 } ); } 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(); }
我们这里需要处理一下
在点击支付以后,首先
异步调用统一下单方法,获取需要的参数
$.post("调用统一下单方法的链接,异步调用",data,function (res) { if(res.error_code == 0){ //获取成功时,把获取到的json字符串转成json对象 callpay($.parseJSON(res.info.jsparam)); }else { layer.msg(res.msg); } });
获取到参数以后 调起微信支付jsapi 就可以支付了
//调用微信JS api 支付 function jsApiCall(jsapi) { WeixinJSBridge.invoke( ‘getBrandWCPayRequest‘, jsapi, function(res){ WeixinJSBridge.log(res.err_msg); if(res.err_msg == "get_brand_wcpay_request:ok" ){ $("#paybtn").attr("disabled", true); window.location.href = "{:url(‘weixin/user/orderpage‘)}"; } // alert(res.err_code+res.err_desc+res.err_msg); } ); } function callpay(jsapi) { 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(jsapi); } }
以上是关于使用easywechat完成微信支付的主要内容,如果未能解决你的问题,请参考以下文章