【微信公众平台开发】关于微信支付jsapi的简单逻辑
最近在做微信公众平台开发,涉及到微信支付的一些东西。刚开始时也是一头雾水,找了各种各样的资料都看不明白,白白折腾了一天。然后事情出现了2个转机,第一个转机是发现了官网的demo,可是下载下来后也是一头雾水,完全不知道怎么用也看不懂。直到第二个转机出现,千辛万苦找到了一个视频教程,才终于略懂了一点。
微信支付认证及配置安全域名什么的就不多说了,我想主要介绍一下jsapi微信支付的逻辑(以官方文档php版demo为例):
从官方文档下的demo里包含下面几个文件夹:
第一步:配置 lib/WxPay.Config.php文件
最主要配置以下四项:
const APPID = '';
const MCHID = '';
const KEY = '';
const APPSECRET = '';
其中APPID和APPSECRET在微信公众平台后台能找到,不必多说。 MCHID在申请微信支付后发来的邮件中可以找到。
KEY需自行登录微信支付商户平台根据指示设置。
第二步:cert证书设置
登录微信支付商户平台,下载微信支付证书后,替换掉demo中cert文件夹即可。这样用户支付后资金就能到对应的公司账户。
第三步:修改example/jsapi.php文件
jsapi.php是调用jsapi发起微信支付的核心文件。在这个文件中最重要的代码为:
//②、统一下单 $input = new WxPayUnifiedOrder(); $input->SetBody("test"); //商品简单描述 $input->SetAttach("test"); //附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据 $input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis")); //商户系统内部的订单号,32个字符内、可包含字母 $input->SetTotal_fee("1"); //总金额 $input->SetTime_start(date("YmdHis")); //交易起始时间 $input->SetTime_expire(date("YmdHis", time() + 600)); //交易结束时间 $input->SetGoods_tag("test"); //商品标记,代金券或立减优惠功能的参数 $input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php"); //接收微信支付异步通知回调地址。 $input->SetTrade_type("JSAPI"); //交易类型 $input->SetOpenid($openId);
我们要修改的就是括号里的内容,其中最重要的两个地方就是SetBody 和SetTotal_fee,其他的都可以跟demo中的一模一样或者自行修改。body对应的是微信支付凭证中的商品名称,会在支付凭证中显示出来,total_fee很明显就是支付总金额。还有一个比较重要的地方是notify_url,demo中将它写死写成支付测试目录的example/notify.php,我们只需将它改为自己项目中的example/notify.php即可。
那么,我们如何从自己的项目中把自己设置的‘商品名称’和'支付总金额'传到jsapi.php这份文件中呢?这是一个比较关键的地方。笔主查阅了很多相关资料及看了一个相关视频。里面大部分说的是用ajax进行传递。由于笔主对ajax了解不是非常透彻,屡次传值均失败。后来笔主想了一个办法:用Session,没错,就是session。在自己的项目用把商品名称和支付总金额用session进行存储。然后修改jsapi.php时就像这样写:
$input->SetBody($_SESSION['body']);
$input->SetBody($_SESSION['fee']);
于是这样就成功把值传过来了。(注意在文件头开启session)
(总结)整个逻辑过程大概就是:
①将整份修改后的官方demo文件夹加入到自己的项目中
②在项目中事先把商品名称和支付总金额用session存好
③点击确认支付后跳转到demo中的example/jsapi.php
④发起微信支付
ps:用session的方式并没有在其他资料中找到。其安全性及效率性有待考证。
拓展:①官方demo的jsapi.php的页面十分简陋影响美观,于是便想跳过这个页面直接发起微信支付。那么我们就需要jquery的帮助。
首先可讲显示部分的html代码全部注释掉,之后引入jquery,最后等页面加载完毕自动调用callpay方法即可。
即:
$(document).ready(function(){
callpay();
});
②大部分人都需要在支付成功后跳转到一个新的页面,那么我们可以将jsapicall函数进行修改,如下:
function jsApiCall() { WeixinJSBridge.invoke( 'getBrandWCPayRequest', <?php echo $jsApiParameters; ?>, function(res){ WeixinJSBridge.log(res.err_msg); //alert(res.err_code+res.err_desc+res.err_msg); if(res.err_msg == "get_brand_wcpay_request:ok") { //支付成功后 window.location.href="想要跳转到的url"; }else{ alert("支付失败"+res.err_code+res.err_desc+res.err_msg); } } ); }
总算写完了~有问题可以留言~谢谢大家。