文档章节

微信公众平台H5支付

仁江
 仁江
发布于 2015/09/30 00:22
字数 1664
阅读 4794
收藏 13
首先说明一点但凡平台开发接口开发都不会太难最主要的一点是看文档~看文档~看文档。
按照文档,第一步,预下单。
**推荐看文档**
[API列表统一下单](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1)

值得注意的是openid值的获取, 直接贴代码这里输入代码`

	/**
	 * 微信统一下单
	 * 
	 * @param fenpay
	 * @param orderStr
	 * @return
	 */
	private String placOrder(int fenpay, String orderStr, String subject) {
		Object openid = WebUtils.getSessionAttribute("openid");
		if (openid == null) {
			throw new ServiceException("没有获得微信授权,不能使用微信支付");
		}
		String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
		SortedMap<String, String> sm = new TreeMap<String, String>();
		// 添加三个固定的参数
		sm.put("appid", WeiXinUtil.APPID);
		sm.put("mch_id", WeiXinUtil.MCH_ID);
		sm.put("notify_url", WeiXinUtil.NOTIFY_URL);
		sm.put("trade_type", WeiXinUtil.TRADE_TYPE);
		sm.put("nonce_str", RandomStringGenerator.getRandomStringByLength(8));
		sm.put("body", subject);
		sm.put("out_trade_no", orderStr);
		sm.put("total_fee", String.valueOf(fenpay));
		sm.put("spbill_create_ip", "127.0.0.1");
		// 现在写死的
		// sm.put("openid", "oMEZLt3zK-GrAnkHRsHxKOaDONpM");
		//
		String openidStr = openid.toString();
		sm.put("openid", openidStr);
		getLogger().debug("opendid:" + openid);
		String sign = WeiXinUtil.createSign(sm);
		getLogger().debug("sign:" + sign);
		String xml = XmlUtil.createXml(sm, sign);
		getLogger().debug("post:" + xml);
		String result = HttpClientUtil.postXML(url, xml);
		getLogger().debug("result:" + result);
		Map<String, String> xmlmap = XmlUtil.parseXml(result);
		// 返回预支付标识
		String prepay_id = xmlmap.get("prepay_id");
		// 凡是拿不到prepay_id都统统归结为下单失败
		if (StringUtils.isEmpty(prepay_id)) {
			throw new ServiceException("微信下单失败");
		}
		return "prepay_id=" + prepay_id;
	}

我是通过授权跳转的方式获取openid,即在点击“去支付”按钮的时候跳转到微信平台进行自动授权然后跳转会指定页面,也可在系统登录的时候就进行授权跳转。贴代码注意加粗代码即可。还是推荐看文档 授权跳转 页面跳转授权

<a href="https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${payUrl2}&response_type=code&state=${user.uid}&scope=snsapi_base" class="paymentbtn">

redirect_uri为你要授权之后跳转回来的url

	/**
	 * 
	 * 活动报名
	 * 
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public String payApply() {
		Map<String, Object> user = (Map<String, Object>) WebUtils.getSessionAttribute("user");
**		// 获得微信支付返回来的state,用来存储登录用户的uid这个时候重新从接口中
		String state = WebUtils.getParameter("state");**
		getLogger().info("获取授权之后的state" + state);
		if (user == null && StringUtils.isNotEmpty(state)) {
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("uid", state);
			String userStr = HttpClientUtil.doGet("http://120.24.240.104/bikeapi/?m=user&a=get_user", map);
			user = (Map<String, Object>) JSON.parse(userStr);
			ActionContext.getContext().getSession().put("user", user);
		}

		if (getActivityId() == null) {
			return "activityerror";
		}
		Activity av = activityService.findById(getActivityId());
		setActivity(av);
**		// 获得用户的openid,支付的时候需要用到
		String code = WebUtils.getParameter("code");**
		// String code = "021ed6c6c2f9b4689e166d7d0ea9caaD";
		if (StringUtils.isEmpty(code)) {
			// 不能获得支付授权
			setMsg("获得微信支付授权失败,不能使用微信支付");
		} else {
**			// ------------一下为获取openid的代码
			String url = "https://api.weixin.qq.com/sns/oauth2/access_token";
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("appid", WeiXinUtil.APPID);
			map.put("secret", WeiXinUtil.APPSECRET);
			map.put("code", code);
			map.put("grant_type", "authorization_code");
			try {
				// 授权字符串
				String authStr = HttpClientUtil.doPost(url, map);
				JSONObject json = new JSONObject(authStr);
				String openid = json.getString("openid");
				// 把他set到session中,这应该是最简单的了吧
				WebUtils.getSession().setAttribute("openid", openid);**
			} catch (Exception e) {
				e.printStackTrace();
				setMsg("获得微信支付授权失败,不能使用微信支付");
			}
		}
		// 没有登录不能报名
		if (user != null) {
			// 查询当前用户的余额,如果查不到那么就是0元咯
			BigDecimal balance = userService.findBalanceByUid(Long.valueOf(user.get("uid").toString()));
			this.setUserBalance(balance);
			return "payapply";
		} else {
			fromUrl = "/index/index!login.action?from_url=/activity/activity!apply.action?id="
					+ String.valueOf(getActivityId());
			return "login";
		}
	}

好的,完成了统一下单之后你应该获取到一个package格式为prepay_id=123456789这样子的订单信息,那么接下来就可以在页面发起支付请求了。 刚开始的时候我按照文档的发起H5支付,结果怎么调试都不成功,相信很多朋友也是在这个地方遇到问题 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7 这个应该是官方文档没更新的原因,新版的微信中已经支持这种发起支付调用,而应该采用JSSDK发起支付请求。直接看到支付的api 输入链接说明 输入图片说明 遇到不懂的地方或者缺少的参数请往上看文档。 主要具体步骤有 输入图片说明

最后贴一下我的发起支付的页面代码,我只能帮你们到这里了,剩下的就是调试了。

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ include file="/common/header.jsp" %>
<title>微信支付</title>
<link rel="stylesheet" type="text/css" href="css/activity.css">
<script type="text/javascript" charset="UTF-8" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script type="text/javascript">

function pay(){
	var appId = $('#appId').val();
	var timeStamp = $('#timeStamp').val();
	var nonceStr = $('#nonceStr').val();
	var pk = $('#package').val();
	var signType = $('#signType').val();
	var paySign = $('#paySign').val();
	//config
	var timeStamp2 = $('#timeStamp2').val();
	var nonceStr2 = $('#nonceStr2').val();
	var signature = $('#signature').val();
	//
	var activityId = $('#activityId').val();
	
	wx.config({
	    debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
	    appId: appId, // 必填,公众号的唯一标识
	    timestamp:timeStamp2 , // 必填,生成签名的时间戳
	    nonceStr: nonceStr2, // 必填,生成签名的随机串
	    signature: signature,// 必填,签名,见附录1
	    jsApiList: ['chooseWXPay'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
	});
	wx.ready(function(){
	    // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
		wx.chooseWXPay({
		    timestamp: timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
		    nonceStr: nonceStr, // 支付签名随机串,不长于 32 位
		    package: pk, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
		    signType: signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
		    paySign: paySign, // 支付签名
		    complete: function (res) {
		        // 支付成功后的回调函数
		    	location.href=basePath+'/activityorder/activity-order!list.action?activityId='+activityId;
		    }
		});
	});
}
</script>
</head>
<body onload="pay()">
	<input id="activityId" type="hidden" value="${activityId}" />
	
	<input id="appId" type="hidden" value="${payparam.appId}" />
	<input id="timeStamp" type="hidden" value="${payparam.timeStamp}" />
	<input id="nonceStr" type="hidden" value="${payparam.nonceStr}" />
	<input id="package" type="hidden" value="${payparam.package1}" />
	<input id="signType" type="hidden" value="${payparam.signType}" />
	<input id="paySign" type="hidden" value="${payparam.paySign}" />
	
	<input id="timeStamp2" type="hidden" value="${apijsmap.timestamp}" />
	<input id="nonceStr2" type="hidden" value="${apijsmap.noncestr}" />
	<input id="signature" type="hidden" value="${apijsmap.signature}" />
</body>
</html>

最后记得在公众平台的公众权限配置,你发起支付的页面一定要是在公众平台设置了授权的页面,调用jsjdk的页面也要授权了的。至于具体要哪些授权,地方太多了慢慢找吧。

© 著作权归作者所有

仁江
粉丝 8
博文 12
码字总数 7176
作品 0
广州
程序员
私信 提问
PHP应用如何对接微信公众号JSAPI支付

微信支付的产品有很多,1. JSAPI支付 2. APP支付 3. Native支付 4.付款码支付 5. H5支付。 其中基于微信公众号开发的应用选择“JSAPI支付“产品,其他APP支付需要“微信开放平台”,H5支付可...

小谜弟
05/16
36
0
微信支付之app支付

1、app支付和H5支付是在两个平台 app支付是在微信开放平台,H5支付是在微信公众平台,因此appid和appsercret 不一样 所需要的商户key是一样的 2、获取预支付订单 app获取预支付订单比h5支付少...

扎西多顿
2016/04/05
354
0
微信H5支付

本篇文件来聊聊微信服务商模式以及商户模式下微信H5支付 先说一个事情。8月1号开始微信公众平台支付的开发配置页面迁移至商户平台 详细说明参考这个或者看下面的截图 平台公告 微信支付商户平...

Javen205
2017/08/23
0
0
微信营销初学者必须弄懂的名词解释

1.微信公众平台   微信公众平台是微信公众账号申请入口和管理后台。商户可以在公众平台提交基本资料、业务资料、财务资料申请开通微信支付功能。   平台入口:http://mp.weixin.qq.com。...

雪深
2015/06/27
457
0
php微信支付接口开发程序(概念篇)

From: https://www.bbsmax.com/A/KE5QLr1kJL/ 阅读对象 本文阅读对象:商户系统(在线购物平台、人工收银系统、自动化智能收银系统或其他)集成微信支付涉及的技术架构师,研发工程师,测试工...

朱先忠老师
2017/09/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JAVA 编写redisUtils工具类,防止高并发获取缓存出现并发问题

import lombok.extern.slf4j.Slf4j;import org.springframework.data.redis.core.BoundHashOperations;import org.springframework.data.redis.core.BoundValueOperations;import org.......

huangkejie
37分钟前
5
0
JMM内存模型(一)&volatile关键字的可见性

在说这个之前,我想先说一下计算机的内存模型: CPU在执行的时候,肯定要有数据,而数据在内存中放着呢,这里的内存就是计算机的物理内存,刚开始还好,但是随着技术的发展,CPU处理的速度越...

走向人生巅峰的大路
54分钟前
95
0
你对AJAX认知有多少(2)?

接着昨日内容,我们几天继续探讨ajax的相关知识点 提到ajax下面几个问题又是必须要了解的啦~~~ 8、在浏览器端如何得到服务器端响应的XML数据。 通过XMLHttpRequest对象的responseXMl属性 9、 ...

理性思考
今天
5
0
正则表达式基础(一)

1.转义 转义的作用: 当某个字符在表达式中具有特殊含义,例如字符串引号中出现了引号,为了可以使用这些字符本身,而不是使用其在表达式中的特殊含义,则需要通过转义符“\”来构建该字符转...

清自以敬
今天
4
0
idea中@Data标签getset不起作用

背景:换电脑以后在idea中有@data注解都不生效 解决办法:idea装个插件 https://blog.csdn.net/seapeak007/article/details/72911529...

栾小糖
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部