微信支付之H5页面WAP端接入

微信支付——微信H5支付实战教程(微信支付v3版本java) 微信支付——微信H5支付下单实战教程(微信支付v3版本java) 阅读详情

更新:2015年12月3日微信提供 Wap 支付, 开发者文档:【微信支付】开发者文档

1.前言

公司是通过支付宝和微信支付那块内容获取收入,app端已经接入成功,现在要做WAP端。需要页面和后台接口一起来实现。

2.接口接入

因为微信支付版本更新了,网上下的demo是V2.5版的,用不了了。所以去网上找资料,看到最新版的V3。

这里我找到了一个统一下单接口,文档入口.

他的接口地址为:https://api.mch.weixin.qq.com/pay/unifiedorder

因此,开始接入我所需要的wap端参数。

这里需要的参数关键有Appid,mch_id,key。

appid和mch_id是在公众平台那边获取。key值是在商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置 这边自己设置的。

坑一:若key值设置不对,会出现错误“支付权限查询失败” 。这时候请检查 appid,mch_id所在的公众号 对应 商户号的key值是否正确。

坑二:我在开发中还遇到“您没有WAP支付权限” 这么个错误。百了很久都没人遇到这个坑。于是,发送邮件给微信支付(weixinpay@tencent.com, wepayTS@tencent.com)这两个邮件我都发了,结果还是漫无回应啊。于是,打通了商户平台的客服(0755-86018333),客服是MM,估计不懂技术问题,叫我去提问平台提交问题(http://kf.qq.com//bills/150821samab01c976f2a.html),说是技术人员看到会回复的,我问是不是 马上回复,MM不说,就说会回复的,唉,毕竟人家客服不懂,就没继续问下去了。打开客服给的网址,填写的时候,发现没有WAP端,也没有统一下单这说法,那我只好填写了  网页(JSAPI)支付 ,下面在详细说明,提交后,出现了个提示,说是七天内给个回应。我去,那还不是白忙活,要7天 业务紧急啊。。

3.代码编写

(1).获取统一下单参数

	public String CreateWapUrl(String outTradeNo, String ip) throws SDKRuntimeException {
		HashMap<String, Object> param = new HashMap<String, Object>();
		param.put("appid", WxPayConfig.APPID);
		param.put("mch_id", WxPayConfig.MCHID);
		param.put("nonce_str", CommonUtil.CreateNoncestr());
		param.put("body", "产品测试");
		param.put("out_trade_no", outTradeNo);
		param.put("total_fee", 1);
		param.put("spbill_create_ip", ip);
		param.put("notify_url", WxPayConfig.NOTIFYURL);
		param.put("trade_type", "WAP");
		param.put("sign", getSign(param));
		return CommonUtil.MapToXml(param);
	}

(2).获取签名值

	public String getSign(HashMap<String, Object> param) throws SDKRuntimeException {
		String sign="";
		String content = CommonUtil.FormatParamMap(param);
		sign =  Sign(content, WxPayConfig.KEY);
		return sign;
	}

	public static String Sign(String content, String key) throws SDKRuntimeException {
		String signStr = "";
		if ("" == key) {
			throw new SDKRuntimeException("财付通签名key不能为空!");
		}
		if ("" == content) {
			throw new SDKRuntimeException("财付通签名内容不能为空");
		}
		signStr = content + "&key=" + key;
		return MD5Util.MD5(signStr).toUpperCase();
	}

(3).工具类方法

	public static boolean IsNumeric(String str) {
		if (str.matches("\\d *")) {
			return true;
		} else {
			return false;
		}
	}

	//map转成xml
	public static String MapToXml(HashMap<String, Object> arr) {
		String xml = "<xml>";
		
		Iterator<Entry<String, Object>> iter = arr.entrySet().iterator();
		while (iter.hasNext()) {
			Entry<String, Object> entry = iter.next();
			String key = entry.getKey();
			String val = entry.getValue()+"";
			if (IsNumeric(val)) {
				xml += "<" + key + ">" + val + "</" + key + ">";

			} else
				xml += "<" + key + "><![CDATA[" + val + "]]></" + key + ">";
		}

		xml += "</xml>";
		return xml;
	}

	//xml转成map
	@SuppressWarnings("unchecked")
	public static Map<String, String> parseXml(String xml) throws Exception {
		 Map<String, String> map = new HashMap<String, String>();
		 Document document = DocumentHelper.parseText(xml);
		 Element root = document.getRootElement();
		 List<Element> elementList = root.elements();
		 for (Element e : elementList) {
			 map.put(e.getName(), e.getText());
		 }
		 return map;
	}
	

	public static String FormatParamMap(HashMap<String, Object> parameters) throws SDKRuntimeException {
		String buff = "";
		try {
			List<Map.Entry<String, Object>> infoIds = new ArrayList<Map.Entry<String, Object>>(
					parameters.entrySet());
			Collections.sort(infoIds,
					new Comparator<Map.Entry<String, Object>>() {
						public int compare(Map.Entry<String, Object> o1,
								Map.Entry<String, Object> o2) {
							return (o1.getKey()).toString().compareTo(
									o2.getKey());
						}
					});

			for (int i = 0; i < infoIds.size(); i++) {
				Map.Entry<String, Object> item = infoIds.get(i);
				if (item.getKey() != "") {
					buff += item.getKey() + "="
							+ URLEncoder.encode(item.getValue()+"", "utf-8") + "&";
				}
			}
			if (buff.isEmpty() == false) {
				buff = buff.substring(0, buff.length() - 1);
			}
		} catch (Exception e) {
			throw new SDKRuntimeException(e.getMessage());
		}
		return buff;
	}

	public static String CreateNoncestr() {
		String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
		String res = "";
		for (int i = 0; i < 16; i++) {
			Random rd = new Random();
			res += chars.charAt(rd.nextInt(chars.length() - 1));
		}
		return res;
	}

(4).发送请求方法

public static String sendPost(String url, String param,String charset) {
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            URLConnection conn = realUrl.openConnection();
            // 设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
          
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());
            // 发送请求参数
            out.print(new String(param.getBytes(),charset));
            // flush输出流的缓冲
            out.flush();
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), charset));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        //使用finally块来关闭输出流、输入流
        finally{
            try{
                if(out!=null){
                    out.close();
                }
                if(in!=null){
                    in.close();
                }
            }
            catch(IOException ex){
                ex.printStackTrace();
            }
        }
        return result;
    }    

(5).执行接口

	//网页版微信支付接口
	public String wxWapPay() throws Exception {
		String result = SUCCESS;
		String message = "";
		int code = 0;
		try {
			String ip = getIpAddr(request);
			String outTradeNo = new SimpleDateFormat("YYYYMMDDHHmmssSSS").format(new Date())+"-wap";
			String param = new WxPayHelper().CreateWapUrl(outTradeNo, ip);
			String resp = HttpRequest.sendPost(WxPayConfig.UNIFIEDORDER_INTERFACE, param, "utf-8");
			Map<String, String> res = CommonUtil.parseXml(resp);
			
			if(res.get("return_code") == "SUCCESS") {
				if(res.get("result_code") == "SUCCESS") {
					message = res.get("code_url");
				}else {
					code = -1;
					message = res.get("err_code_des");
					logger.error("wxWapPay error code"+res.get("err_code")+", reason is "+res.get("err_code_des"));
				}
			}else {
				code = -1;
				message = res.get("return_msg");
				logger.error("wxWapPay error reason is "+res.get("return_msg"));
			}
		} catch (Exception e) {
			code = -1;
			logger.error("wxWapPay Exception reason is "+ e);
			e.printStackTrace();
		}
		dataMap = new HashMap<String, Object>();
		dataMap.put("code", code);
		dataMap.put("message", message);
		
		return result;
	}


更多参考

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1









iOS H5微信支付总结 功能描述 1、webView加载H5页面 2、点击微信支付,调起微信客户端支付 3、支付完成,返回APP 操作流程 1、调起微信的项目设置 选中‘TARGETS’一栏,在‘info’中的‘LSApplicationQueriesSchemes’添加‘weixin’,已添加过的可以忽略此步骤 2、H5拦截微信支付请求,跳转微信 2.1 WKWebView /... 阅读详情

相关推荐

h5 支付宝支付/微信支付

h5微信/支付宝支付

u014105739的博客 845

pc网站和手机端h5网站开发接入微信支付

pc网站和手机端h5网站开发接入微信支付

稻草人的格子衫 4301

H5微信支付完整版实战指南_集成微信支付分与开发流程解析

H5微信支付远不止“调个接口、跳个链接”那么简单。它考验的是你对以下几个方面的综合掌控力:✅安全性:签名验证、HTTPS、防重放、防伪造✅可靠性:异步通知、主动查询、幂等控制✅一致性:状态机设计、分布式锁、消息队列✅体验优化:跳转引导、回跳路径、加载反馈✅扩展能力:支付分、商品明细、营销标签当你把这些模块有机地串联起来,才能真正做到“用户无感,系统稳健”。

weixin_36001279的博客 1274

微信支付之HTML5页面WAP端接入

微信支付之HTML5页面WAP端接入 分类标签: HTML          1. 前言   公司是通过支付宝和微信支付那块内容获取收入,app端已经接入成功,现在要做WAP端。需要页面和后台接口一起来实现。   2. 接口接入   因为微信支付版本更新了,网上下的demo是V2.5版的,用不了了。所以去网上找资料,看到最新版的V3。   这里我找到了一

qq907384382的专栏 3734

支付宝WAP与微信H5支付接口集成实战

htmltable {th, td {th {pre {简介:在移动互联网时代,为提升用户支付体验,商家常集成多种在线支付方式。本文重点介绍“支付宝WAP支付接口”和“微信H5支付接口”的配置、流程与安全机制,适用于网页端及非APP场景的移动端支付。通过沙箱测试与实际调用,帮助开发者掌握两大主流支付平台的接入方法,确保交易安全、稳定,并提高订单转化率。内容涵盖接口申请、参数设置、支付跳转、异步通知处理及合规注意事项,适合电商平台或Web应用开发参考。

weixin_31620365的博客 1369

威富通-微信wap(也称H5支付)接口文档

威富通-微信wap(也称H5支付)接口文档和demo代码!

非微信内如何调起wap版微信支付

微信支付一直没有出wap版,wap版想用微信支付,只有在微信内调用才可以。今天偶然发现,中国电信一个wap站点, 不在微信内也能调起微信支付,而且官方还提供了一个demo。 WAP怎么调起客户端? 在中国电信这个wap站点内,点击选择微信支付的时候,ajax去请求了一个页面weixin.do,返回的信息里面有一个url:  weixin://wap/pay?appid%3Dwxb...

weixin_33744141的博客 736

微信wap支付配置教程.doc

微信支付完整开通及配置教程,全文最全面、最详细的设置教程

生成微信h5支付mweb url调起支付,微信mweb_url怎么使用

微信mweb_url其实是一个链接, 当用户在手机上访问mweb_url时, 会调起微信支付, 从而实现用户在线付款的功能, 这是微信h5支付方便的地方。 下面子恒老师详细说一下mweb url… 一、 生成微信h5支付mweb_url支付链接 想要获取mweb_url, 需要调用微信h5支付的统一下单接口 https://api.mch.weixin.qq.com/pay/unifiedor...

qq_39414785的博客 2万+

Qwen2.5-Omni实战:5分钟搞定多模态AI模型本地部署(含Thinker-Talker架构解析)

本文详细介绍了Qwen2.5-Omni多模态AI模型的本地部署流程,包括硬件配置、环境准备和实战应用开发。特别解析了其创新的Thinker-Talker架构,该架构通过TMRoPE位置编码实现跨模态同步处理,大幅提升多模态任务效率。5分钟即可完成部署,适合开发者快速实现文本、图像和音频的联合处理。

weixin_29085865的博客 171

实战案例:用多智能体系统模拟房地产市场的架构设计

房地产市场是典型的复杂自适应系统:买方纠结“要不要上车”、卖方盘算“挂多少钱能快速成交”、中介忙着“撮合两边赚佣金”、政府琢磨“怎么调政策稳房价”——每一个参与者的微小决策,最终都会汇聚成“房价暴涨”“成交冰点”这样的宏观现象。传统的计量经济学模型(比如线性回归)假设“所有人都是理性人”,但现实中没人能算清所有变量——你可能因为“同事买了学区房”就跟风,也可能因为“怕失业”而放弃买房。这时候,多智能体系统(MAS)

移动开发前沿的博客 1122

第三方支付接入(微信,支付宝)

QY 最近工作中安排了三方支付接入(一般就是微信,支付宝,银联),目前接入的是微信和支付宝; 阶段接近尾声并且测试很OK,现在记录一下开发过程. 目前对接了只有,支付宝的PC,H5,以及微信的PC,H5,JSAPI这几种, APP的支付暂时没有需求,所以没做考虑 大家在对接过程中如果遇到问题,欢迎留言,我看到会及时回复的.发私信也可以.希望对大家有帮助; 对接前提 你需要在支付宝或微信平台创建自己的应用,得到我们后续需要用到的各种id和secret 支付宝是有SDK的,记得引入依赖 至于怎么在微信和支付宝的

hardworking_boy的博客 1万+

公文派2025:免费社区版重大安装更新!

距离上一次更新已经过去了将近一年的时间,今天我们带来了全新的免费2025社区版,该版本也是目前最新的版本,无需授权即可使用所有的功能。

似最初 1963

微信公众号开发---微信支付之H5页面WAP端接入

更新:2015年12月3日微信提供 Wap 支付, 开发者文档:【微信支付】开发者文档 1.前言 公司是通过支付宝和微信支付那块内容获取收入,app端已经接入成功,现在要做WAP端。需要页面和后台接口一起来实现。 2.接口接入 因为微信支付版本更新了,网上下的demo是V2.5版的,用不了了。所以去网上找资料,看到最新版的V3。 这里我找到了一个统一下单接口,文档入口.

啊哈程序 4705

RFC-only 与 SAProuter 场景下,让 Claude 真正参与 SAP ABAP 开发

SAP ABAP 开发这几年正在出现一个很有意思的变化。过去我们说开发工具,脑子里大多是 SE80、SE38、SE24、SEGW、Eclipse ADT,再往后是 BAS、VS Code、abapGit、ATC、CI/CD。现在又多了一层,Claude Code、Claude Desktop 这类 AI 编程助手开始通过 MCP 进入开发现场,不只是写一段示例代码,而是能读系统里的 ABAP 对象、搜索包、改源码、跑检查、辅助重构。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1617

第 10 篇:深度学习的“军火库”——CNN、RNN与Transformer,AI如何看懂世界?

深度学习的革命,不是依赖单一的通用大脑,而是为不同任务打造了专属“军火库”:CNN用“局部感知”看懂图像,RNN用“循环记忆”理解序列,而Transformer则用“全局注意力”开启了AIGC时代。理解这些架构,不是记忆孤立的技术,而是洞察AI从“专才”走向“通才”的进化脉络。

maqh_csdn的博客 786

Android webview加载H5页面调起微信支付

场景 一个H5的页面,需要在app内用webview展示,然后涉及到支付,要求能够调用微信支付来付款,页面没有问题,但是写完出现了一些问题。 问题 页面不显示,展示空白 需要设置: webSettings.setDomStorageEnabled(true); 否则,一些节点不支持显示,建议都加上这一句,并设置为true。 点击支付调不起微信 因为,webview支持http和https的scheme,我们知道微信的schem是weixin://,所以我们需要拦截这个url,并手动处理。 需要我们重写:

苦逼的程序猿☺ 3771

人工智能智能体研究综述:从理论架构到前沿应用

AI Agent,即人工智能智能体,是指能够在特定环境中自主感知、推理、决策并执行行动以实现特定目标的智能系统[1]。自主性反应性主动性(Pro-activeness)和社会性fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;AI Agent核心特征自主性 Autonomy反应性 Reactivity主动性 Pro-activeness。

nmdbbzcl的博客 902

php wap微信h5支付接口,微信支付开发H5支付

本文介绍微信支付下的H5支付实现流程。一、介绍H5支付是基于公众号基础开发的一种非微信内浏览器支付方式(需要单独申请支付权限),可以满足在微信外的手机H5页面进行微信支付的需求。。测试地址http://wxpay.weixin.qq.com/pub_v2/pay/wap.v2.phphttp://wxpay.weixin.qq.com/mch/pay/h5.v2.php效果图 流程图二、商品信息准...

weixin_39792393的博客 1306

snmp MIB详解

每个 MIB 对象都由一个对象标识符(OID)和对象类型组成。OID 是一个由多个数字组成的路径(类似于 IP 地址),它标识了 MIB 中对象的层次结构。

dlz0836的博客 3719

基于 Spring Cloud 环境污染物数据分析与预测平台

基于 Spring Cloud 环境污染物数据分析与预测平台

934

WebView H5 跳转微信支付、支付宝、QQ钱包WAP

最新小菜在用研究借助 WebView h5 跳转 微信和支付宝支付页面,研究了挺久,一直没有找到合适的判断。很简单的两小段代码分享一下,希望可以帮助需要的朋友。 目前小菜是借助的 TBS X5 浏览器内核的 WebView,原理是一样的。主要是对url内容的判断,以下是关键代码部分,大家一看便了解: 可以支持的包括:微...

weixin_34324081的博客 1742

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

iOS H5调微信支付与回调

转载自:https://www.jianshu.com/p/30ca8b2c1235 我这里用的是WKWebView,首先要实现WKNavigationDelegate协议 1、由H5页跳转微信客户端--WKNavigationDelegate方法 该方法是决定H5页面是否允许跳转的 -(void)webView:(WKWebView*)webView decidePolicyForNav...

沸腾的泪水的专栏 1408

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: 在linux上安装mysql
下一篇: 在linux上安装postgresql
蚂蚁爱吃糖
博客等级 码龄16年 15粉丝 39原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值