手把手教你--JAVA微信支付(H5支付)

2023-11-02

概述

之前说过,有时间把微信支付的H5支付讲解下,一直拖了半年时间,最近的项目正好又温习了支付功能,趁着热乎,抓紧起来。

微信的H5支付,相对公众号支付,容易了跟多,很多相似的东西,也有不同之处,这里只介绍H5支付的关键点,其他内容请先去看我的微信支付(公众号支付)那篇文章。

(传送门:https://blog.csdn.net/javaYouCome/article/details/79473743)。

什么是H5支付?

官网定义:要求商户已有H5商城网站,并且已经过ICP备案。通过微信H5支付可以实现在非微信浏览器(如QQ浏览器、谷歌浏览器、Safari等)中使用微信支付的场景。ps:说白了就是在微信外的所有浏览器如UC浏览器来点击“微信支付”然后自动唤起微信客户端来支付。

如果要测试支付的话,可以找个内网穿透的软件如(花生壳或natapp)他们的域名都是ICP备注过的,然后从手机浏览器访问微信支付的页面。

开发步骤

一、准备工作

1.  预备好微信支付的“四大参数”--(默认已准备好)。

2.1  在“商户平台”-我的产品-中开通H5支付,大概半天左右的时间可以审核通过。

 2.2在-开发配置中填写H5支付域名,必须填写,要不然不能支付。

二、开发流程

1.前端部分:H5支付前端的东西很少,就是点击“微信支付”,后端接口只返回一个用来跳转的地址(下面还会提到),然后跳转到这个地址就OK了,所以难点是后台部分。

2.后端部分:后台还是调用微信的“统一下单”接口,不过H5的“统一下单”所需参数少了很多。咱们看看都有那些参数:

其中必须的参数有:

1.appid--“四大参数”之一

2.mch_id--“四大参数”之一

3.nonce_str--随机字符串--用工具类获取

4.body--商品描述

5.out_trade_no--商城的订单号保持唯一

6.total_fee--支付金额单位:分

7.spbill_create_ip--ip地址

8.notify_url--支付成功回调地址

9.trade_type--交易类型--只能用“MWEB”

10.scene_info--场景信息值是个json字符串,注意给值时转义“双引号”,例子:"{\"h5_info\":{\"type\":\"Wap\",\"wap_url\":" 可以填应该网站的URL地址 ",\"wap_name\": \"订单支付\"}}"

11.sing--签名加密

H5支付的“统一下单”参数就是这么简单,把上面的参数整理好POST发送微信统一下单接口,返回的是个XML的字符串,如果成功,返回的是类似如下(美化后的字符串-微信后台返回的是一行):

<xml>
  <return_code><![CDATA[SUCCESS]]></return_code>
  <return_msg><![CDATA[OK]]></return_msg>
  <appid><![CDATA[wx472b07299797774c]]></appid>
  <mch_id><![CDATA[1509488571]]></mch_id>
  <nonce_str><![CDATA[saPUVwW5nyHhB8tr]]></nonce_str>
  <sign><![CDATA[D0ACD36B851EEBBA97F0577CC752CCB9]]></sign>
  <result_code><![CDATA[SUCCESS]]></result_code>
  <prepay_id><![CDATA[wx28141313363954c5e9d84aeb3180413256]]></prepay_id>
  <trade_type><![CDATA[MWEB]]></trade_type>
  <mweb_url><![CDATA[https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx28141313363954c5e9d84aeb3180413256&package=90763707]]></mweb_url>
</xml>

里面的 mweb_url就是上面提到的前端要的跳转页面了,如果你想在支付完后,跳到指定页面可以在值的后面拼接指定redirect_url即可(要urlencode)如下:。

前端只需 location.href = mweb_url就可以开心的唤起微信来支付了

三、代码部分

1.前端代码

一般我们的代码需要处理公众号H5支付的情况,js代码navigator.userAgent返回客户端信息如果里面有"MicroMessenger"表示是微信浏览器,可以用公众号支付,否则用H5支付,可以参考如下代码:

页面有“微信支付”按钮,点击执行pay()方法。

function pay() {
    if (navigator.userAgent.indexOf("MicroMessenger") != -1) {
        pay_weixin();//微信浏览器支付
    } else {
        pay_other();//其他浏览器H5支付
    }
}

function pay_other() {
    var url = WEB + "/pay/orders_other
    $.get(url,function(result) {
        location.href = result.mweb_url;
    });
}
function pay_weixin() {
	//公众号支付方法
}

2.后端代码  里面的工具类,可以参考公众号支付里面有。

/**
 * @Description H5调起微信支付微信浏览器外支付
 * @param request
 * @return Map
 */
 
@RequestMapping(value="orders_other", method = RequestMethod.GET)
@ResponseBody
public Map<String,String> orders_other(HttpServletRequest request) {
	try {
		//拼接下单地址参数
		Map<String, String> paraMap = new HashMap<String, String>();
		//获取请求ip地址
		String ip = getIP(request);
		
		paraMap.put("appid", appid);  
		paraMap.put("mch_id", mchId);  
		paraMap.put("nonce_str", WXPayUtil.generateNonceStr());  
		paraMap.put("body", "XX商城-订单结算");  
		paraMap.put("out_trade_no", "201810102938949");//商品的订单号每次要唯一
		paraMap.put("total_fee", "1");
		paraMap.put("spbill_create_ip", ip);  
		paraMap.put("notify_url", "www.xxxxxx.com/pay/callback"));// 此路径是微信服务器调用支付结果通知路径  
		paraMap.put("trade_type", "MWEB");
		paraMap.put("scene_info", "{\"h5_info\":{\"type\":\"Wap\",\"wap_url\":"随意地址可以是公司官网地址",\"wap_name\": \"订单支付\"}}");
		
		String sign = WXPayUtil.generateSignature(paraMap, paternerKey);
		paraMap.put("sign", sign);
		String xml = WXPayUtil.mapToXml(paraMap);//将所有参数(map)转xml格式
		
		// 统一下单 https://api.mch.weixin.qq.com/pay/unifiedorder
		String unifiedorder_url = https://api.mch.weixin.qq.com/pay/unifiedorder;

		String xmlStr = HttpRequest.sendPost(unifiedorder_url, xml);//发送post请求"统一下单接口"
		
		//以下内容是返回前端页面的json数据
		String mweb_url = "";//跳转链接
		if (xmlStr.indexOf("SUCCESS") != -1) {  
			Map<String, String> map = WXPayUtil.xmlToMap(xmlStr);
			mweb_url = (String) map.get("mweb_url");  
           
            //支付完返回浏览器跳转的地址,如跳到查看订单页面
			String redirect_url = "www.xxxxx.com/orders";
			String redirect_urlEncode =  URLEncoder.encode(redirect_url,"utf-8");//对上面地址urlencode
			mweb_url = mweb_url + "&redirect_url=" + redirect_urlEncode;//拼接返回地址
		}
		
		Map<String, String> payMap = new HashMap<String, String>();
		payMap.put("mweb_url", mweb_url);
		return  payMap;
	} catch (Exception e) {  
		_log.info("微信支付异常");
	}  
	return null;
	
}

返回给前端的结果如下所示:

H5支付就是这么多了,可能不会一次调通,耐心看错误提示,祝早日支付成功。(完)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

手把手教你--JAVA微信支付(H5支付) 的相关文章

  • LoadStdProfileSettings -- 加载MRU

    如何为自己的应用程序加入最近文件列表功能呢 最简单的方法就是在你新建工程的时候选择包含最近文件列表功能 也就是在 MFC AppWizard 的第 4 步的时候使 How many files would you like on your

随机推荐

  • 06.RabbitMQ重试机制

    RabbitMQ重试机制 补偿机制 在消费中如果发生异常了 RabbitMQ会使用补偿机制 重试 如果消息没消费成功 会一直重复发送 直到消费成功为止 我们以之前的P2P例子为例 Component RabbitListener queue
  • antd中Form.Item无法获取到对应的表单值解决

    antd中Form Item无法获取到对应的表单值解决 前言 问题代码示例 解决 前言 本文章讲的解决方案只是其中一种 无法获得对应表单的原因有很多 只能在今后的道路上慢慢采坑然后避免 问题代码示例 import React Compone
  • Retrofit中的注解原理项目实战

    今天我们来聊聊这个最近很火的网络请求库retrofit 在此基础上会延伸出一些列的知识点 现在关于retrofit的文章很多 我之所以写这篇文章的原因在于 8月份负责假设新客户端底层的过程中首次尝试使用该库 并取得非常不错的效果 不到20天
  • 计算机视觉最新技术:YOLOv8等前沿算法推荐!

    计算机视觉最新技术 YOLOv8等前沿算法推荐 计算机视觉是人工智能领域中的一个重要方向 它涉及到图像 视频等多媒体形式的信息处理 而随着人工智能技术的不断发展 计算机视觉领域也不断涌现出新的算法和模型 其中 YOLOv8等一系列算法被认为
  • 初识springcloud(微服务)

    1 微服务的定义 microservice 1 多个微服务开发的依然是一个完整的应用 2 微服务都会独立运行在一个独立的进程里面 3 微服务之间通常会采用轻量级的通信机制来进行通信 比如http https socket netty dub
  • python 视频流分析,通过ffmpeg管道将视频输出流到Python脚本中进行分析。如何导入python?...

    我正在与其他库一起编写一个脚本 它需要RGB24格式的帧或图像 为了提高兼容性 我决定允许外部管道将帧流式传输到这个程序中 每次在代码中使用更改设备或源代码可能会变得乏味 使用解析器简单地指定源代码会导致语法错误 示例 ffmpeg f d
  • python如何更新包

    python如何更新包 更多python视频教程请到菜鸟教程https www piaodoo com Python安装新包 pip是很好用的安装工具 pip list 可以查询所有已安装的包和版本 怎么知道本地安装包的版本是否有可以更新的
  • Python模拟智能开关设备MQTT接入阿里云物联网平台 - PyCharm paho.mqtt

    概要 Python 使用 paho mqtt 库 利用阿里云物联网平台的设备证书 productKey deviceName deviceSecret 自动合成 userName passWord 以MQTT通信协议接入阿里云物联网平台 并
  • IPFS搭建私有网络

    87条消息 IPFS 节点搭建 躺在家里不干活的博客 CSDN博客 ipfs节点搭建 一 安装go ipfs 1 下载 下载地址https gitee com wang ya nan go ipfs releases wget https
  • Hadoop Spark 常见问题【一】

    Spark 1 RDD 数据集拆分 数据存储在内存或者磁盘 多分区 失效自动重构 转换操作构造 2 RDD俩种依赖 窄依赖 父RDD中的分区最多只能被一个子RDD的一个分区使用 和宽依赖 子RDD依赖于所有父RDD 3 spark 角色 1
  • APS高级计划排程系统和生产排产系统

    一 什么是APS系统 高级计划与排程APS Advanced Planning and Scheduling 是指在考虑生产资源约束的前提下 通过优化方法 为生产加工任务精确安排生产资源和计划生产时间 使生产及时完成 并使资源充分利用 AP
  • 【WebRTC 02】从摄像头获取视频以及切换分辨率和视频源

    上一节中我们已经搭建出了用于操作的环境 这一节我们要实现的一个小目标 就是将电脑摄像头拍到的内容实时显示到网页上 同时我们一起学习下原理 并做一些小拓展 文章目录 操作环境 实现效果 几个概念 HTML5中的Audio和Video API
  • C++项目练手:矩阵类的功能实现

    C 项目练手 矩阵类的功能实现 C 课程设计 矩阵类的相关功能实现 矩阵简述 实数矩阵是由一个按照长方阵列排列的实数集合 除数据外 两个实数矩阵可以进行加法和乘法运算 一个矩阵也可以和一个实数相乘 得到一个新的矩阵 请基于抽象出的矩阵的属性
  • JavaScript进阶之高阶函数(Higher-order function)

    你还在以为 map reduce filter 是高阶函数吗 高阶函数听上去很让人不明觉厉 但其实也并没有什么特别厉害的地方 只是网上的定义一直让我们有点模糊而已 接下来我们来详细讲讲 首先是定义 查自百度百科 定义 在数学和计算机科学中
  • 二进制安装docker

    二进制安装docker文档 建模部署 docker安装 下载docker 因rpm包安装依赖较多 选择二进制安装 下载地址如下 https download docker com linux static stable x86 64 创建d
  • 区域生长

    转自 https blog csdn net qq 37764129 article details 81227091 注 本程序只能做图像分割 结果图是转自原作者的 暂时没实现该功能 1 理论基础 区域生长算法的基本思想是将有相似性质的像
  • 称重问题递归解法

    用天平称重时 我们希望用尽可能少的砝码组合称出尽可能多的重量 如果只有5个砝码 重量分别是1 3 9 27 81 则它们可以组合称出1到121之间任意整数重量 砝码允许放在左右两个盘中 本题目要求编程实现 对用户给定的重量 给出砝码组合方案
  • 【小沐学NLP】Python实现中文、英文分词

    NLP开发系列相关文章编写如下 1 小沐学NLP Python实现词云图 2 小沐学NLP Python实现图片文字识别 3 小沐学NLP Python实现中文 英文分词 4 小沐学NLP Python实现聊天机器人 ELIZA 5 小沐学
  • win10 提供管理员权限才能删除文件夹

    计算机管理员帐户 也就是我们熟知的 Administrator 拥有可执行影响其他用户操作的权限 由于win10专业版刚发布 很多用户不知道怎么取得管理员权限 接下来小编就跟大家分享启用管理员权限的方法 1 打开win10专业版的开始菜单中
  • 手把手教你--JAVA微信支付(H5支付)

    概述 之前说过 有时间把微信支付的H5支付讲解下 一直拖了半年时间 最近的项目正好又温习了支付功能 趁着热乎 抓紧起来 微信的H5支付 相对公众号支付 容易了跟多 很多相似的东西 也有不同之处 这里只介绍H5支付的关键点 其他内容请先去看我