Skip to content
标签
支付
字数
1656 字
阅读时间
7 分钟

一、微信支付

微信具体支付方式

  • 刷卡支付

刷卡支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式。主要应用线下面对面收银的场景, 一般出现在商场上。

公众号支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。应用场景有:

Ø ◆ 用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付

Ø ◆ 用户的好友在朋友圈、聊天窗口等分享商家页面连接,用户点击链接打开商家页面,完成支付

Ø ◆ 将商户页面转换成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付

  • 扫码支付

扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。

  • APP支付

APP支付又称移动端支付,是商户通过在移动端应用APP调起微信支付模块完成支付的模式。

生成二维码

项目中引入qrcode.js,可快速生成二维码

html
<html>
  <head>
  	<!-- 1. 导入js文件 -->
  	<script type="text/javascript" src="js/jquery-3.2.1.min.js"></script>
  	<script type="text/javascript" src="js/qrcode.js"></script>
  </head>
  <body>
    <!-- 2. 提供一个div用于显示二维码 -->
    <div style="text-align:center" id="qrcode"></div>
  </body>
  <!-- 3.使用qrcode.js制作二维码 -->
  <script type="text/javascript">
  	var qr=qrcode(10,'H');  //提供两个参数, 第一个参数用来设置图片大小(1-10), 浏览器只能支持3~10 
                       //第二个参数用来设置容错级别  L(7%)  M(15%)  Q(25%)  H(35%)
  	qr.addData("http://www.itcast.cn");  //往二维码中存储一个url地址
  	qr.make();  //生成二维码
  	$("#qrcode").html(qr.createImgTag());  //显示二维码
  </script>
</html>

代码实现微信扫码支付

相关概念:

  1. appid:微信公众账号或开放平台APP的唯一标识

  2. partner:商户号 (配置文件中的partner)

  3. partnerkey:商户密钥

  4. sign:数字签名, 根据微信官方提供的密钥和一套算法生成的一个加密信息, 就是为了保证交易的安全性

认证流程

微信扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。

申请步骤:(了解)

第一步:注册公众号(类型须为:服务号

请根据营业执照类型选择以下主体注册:个体工商户| 企业/公司| 政府| 媒体| 其他类型

第二步:认证公众号

公众号认证后才可申请微信支付,认证费:300元/次。

第三步:提交资料申请微信支付

登录公众平台,点击左侧菜单【微信支付】,开始填写资料等待审核,审核时间为1-5个工作日内。

第四步:开户成功,登录商户平台进行验证

资料审核通过后,请登录联系人邮箱查收商户号和密码,并登录商户平台填写财付通备付金打的小额资金数额,完成账户验证。

第五步:在线签署协议

本协议为线上电子协议,签署后方可进行交易及资金结算,签署完立即生效

第六步:查看自己的公众号信息

image-20220625223454119

微信sdk

在线微信支付开发文档

微信sdk方法

java
// 获取随机字符串
WXPayUtil.generateNonceStr();
// Map转换为xml字符串(自动添加签名)
WXPayUtil.generateSignedXml(param, partnerkey)
// XML字符串转换为MAP
WXPayUtil.xmlToMap(result)

代码示例

生成支付信息

java
// 调用微信后台接口,将数据返回,前端根据 返回数据的code_url生成二维码
try {
			//1 获取用户的请求参数
			String pname = request.getParameter("pname"); // 商品的名称
			String price = request.getParameter("price"); //要支付的金额
			
			//2 编写商户的信息
			Map<String, String> param = new HashMap<String, String>();
			param.put("appid", PayConfig.appid);// 公众号id
			param.put("mch_id", PayConfig.partner);  //商户的账号
			param.put("nonce_str", WXPayUtil.generateNonceStr()); //随机字符串
			param.put("body", pname); //商品描述
			String orderId = WXPayUtil.generateNonceStr(); // 订单号
			param.put("out_trade_no", orderId);
			param.put("total_fee", price); // 支付的金额 , 单位是分
			param.put("spbill_create_ip", "127.0.0.1"); // ip地址
			param.put("notify_url", PayConfig.notifyurl); //通知地址 
			param.put("trade_type", "NATIVE"); //交易类型
			
			//3 生成数字签名, 同时把上面的参数都编写成xml格式的数据
			String xml = WXPayUtil.generateSignedXml(param, PayConfig.partnerkey);
			
			
			//4 把这些信息发送给微信支付后台
			String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
			HttpClient client  = new HttpClient(url);
			client.setHttps(true);//开启https协议
			client.setXmlParam(xml);//设置xml格式的数据
			
		
			client.post();//发送请求
			
			//5 获取微信支付后台返回的数据
			String content = client.getContent();
			Map<String,String> resultMap = WXPayUtil.xmlToMap(content);//把返回的数据转换成map集合
			resultMap.put("orderId", orderId);
			resultMap.put("money", price);
			
			
			//6 把map集合转换成json格式的数据,然后写出
			Gson gson = new Gson();
			String json = gson.toJson(resultMap);
			
			response.setContentType("text/json;charset=utf-8");
			response.getWriter().write(json);
			
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

查询支付状态

java
try {
			response.setContentType("text/json;charset=utf-8");
			
			//1 获取用户的请求参数,订单号
			String orderId = request.getParameter("orderId");
			
			//2 填写商户信息
			Map<String, String> param = new HashMap<String, String>();
			param.put("appid", PayConfig.appid); // 公众号的唯一标识
			param.put("mch_id", PayConfig.partner); //商户的账号
			param.put("out_trade_no",orderId); // 订单号
			param.put("nonce_str", WXPayUtil.generateNonceStr()); //随机字符串
			
			//3 数字签名与把上面参数写成xml格式
			String xml = WXPayUtil.generateSignedXml(param, PayConfig.partnerkey);
		
			//4 把信息发送给微信支付后台
			HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/orderquery");
			client.setHttps(true);
			client.setXmlParam(xml);
			
			long startTime = System.currentTimeMillis(); //定义一个变量记录开始发送请求的时间
			
			while(true){
				//发送请求
				client.post();
				
				
				//5 获取微信支付的返回值
				String content = client.getContent();
				//把xml转换map对象
				Map<String,String> resultMap = WXPayUtil.xmlToMap(content);
				
				
				//把map转换成json向页面输出
				Gson gson = new Gson();
				String json = gson.toJson(resultMap);
				
				//情况一:用户已经支付
				if("success".equalsIgnoreCase(resultMap.get("trade_state"))){
					response.getWriter().write(json);  // trade_state=success 
					break;
				}
				
				//情况2: 超过30秒用户还是没有支付
				if(System.currentTimeMillis()-startTime>30000){
					response.getWriter().write(json);  // trade_state=NOTPAY
					break;
				}
				
				
				Thread.sleep(3000);
			}
		
		
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}