【微信公众平台开发】关于微信支付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);
                    }
			}
		);
	}

总算写完了~有问题可以留言~谢谢大家。
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-21 19:05
点赞 评论 收藏
分享
喜欢吃蛋糕仰泳鲈鱼是我的神:字节可以找个hr 给你挂了,再放池子捞
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务