Springboot实现手机调起微信支付

手机调起微信支付

上篇更新的博客中介绍了手机网站调起支付宝,这一篇介绍一下手机端调起微信支付

项目需求:
1.在浏览器外部唤醒手机端的微信应用
2.实现微信支付
3.修改数据库订单的状态值

一.准备工作

微信支付用户开发文档
微信支付商户平台
微信支付相关参数的获取
需要获取的参数
1.微信公众号身份的唯一标识:appid
2.受理商ID,身份标识(商户id):mchid
3.商户支付密钥Key(这个需要商户自己设置):partner.key
4.微信支付成功回调地址:notify.url

二.代码实现

注意:此时我还是在测试环境中,所以回调地址使用的是内网穿透
natapp.cn

1.BeginController.java

@RequestMapping("/wx")
    public String wx(Model model,@RequestParam("oid") String oid){
        //根据id找对象
        OrderMaster orderMaster=orderMasterMapper.selectById(oid);
        Integer value1=orderMaster.getOrderMoney().intValue();
        model.addAttribute(orderMaster);
        model.addAttribute(value1);
        System.out.println(orderMaster);
        System.out.println(value1);
        return "pay";
    }

2.pay.html

<!DOCTYPE html>
<html xmlns:th="http://www.w3.org/1999/xhtml">
<head>
 <meta charset="UTF-8">
 <title>微信支付</title>
 <base href="http://mkqy.natapp1.cc/">
 <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<body>
<input type="hidden" th:value="${orderMaster.orderId}" id="oid"/>
<input type="hidden" th:value="${orderMaster.orderMoney}" id="value"/>
</body>
<script type="text/javascript">
    var oid=$("#oid").val();
    var value=$("#value").val();
    alert(value);
    $.ajax({
        type : "POST",
        data:{
            "oid":oid,
            "value":value
        },
        //这里换成你自己的项目请求路径
        url : "/pay/wxpay?oid="+oid+"&value="+value,
        success:function(data){
            console.log(data);
            window.location.href=data;
        }
    });
</script>
</html>

3.WxpayController.java

@ResponseBody
	@RequestMapping(value = "/wxpay", method = RequestMethod.POST)
	public String wxpay(Model model,HttpServletRequest request, HttpServletResponse response, @RequestParam("oid")String oid, @RequestParam("value") Integer value) throws Exception {
		/**
		 *加载配置文件中的商户参数
		 */
		String appID = ResourcesUtil.getValue("config", "wxpay.appid");
		String mchID = ResourcesUtil.getValue("config", "wxpay.mchid");
		String partnerKey = ResourcesUtil.getValue("config", "wxpay.partner.key");
		String oid1=oid.substring(0,20);
		System.out.println("====>oid"+oid);
		System.out.println("====>oid1"+oid1);
		String notifyUrl =ResourcesUtil.getValue("config","wxpay.notify.url");
				//ResourcesUtil.getValue("config","wxpay.notify.url");
		//获取会员ip地址(有的手机可以直接获取到真实ip,大部分都是有代理的)
		String ip = IPUtils.getIp(request);
		System.out.println("此时用户的手机对应的ip地址是:"+ip);
		// 加载场景信息(可以直接写成Json字符串,我这里处理了一下)
		H5ScencInfo scene = new H5ScencInfo();
		H5ScencInfo.H5 h5_info = new H5ScencInfo.H5();
		h5_info.setType("WAP");
		h5_info.setWap_url("http://mkqy.natapp1.cc");
		h5_info.setWap_name("皮皮萍");
		scene.setH5_info(h5_info);
		String sceneInfo = scene.toString();
		/**
		 * 拼接微信微信支付参数
		 */
		WxPayApiConfig params = WxPayApiConfig.New();
		//AppId
		params.setAppId(appID);
		//商户号
		params.setMchId(mchID);
		//商品简单描述(订单名)
		params.setBody(oid1);
		//用户端IP
		params.setSpbillCreateIp(ip);
		//订单总金额,单位为分  (momey* 100).toFixed()
		//BigDecimal val=new BigDecimal(100);
		params.setTotalFee(String.valueOf(value*100));
		//H5支付的交易类型为MWEB(默认)
		params.setTradeType(WxPayApi.TradeType.MWEB);
		//微信支付成功后的回调Url
		params.setNotifyUrl(notifyUrl);
		//商户秘钥
		params.setPaternerKey(partnerKey);
		//随机字符串,不长于32位(我这里直接获取当前时间毫秒值)
		params.setOutTradeNo(String.valueOf(System.currentTimeMillis()));
		//场景信息Json字符串
		params.setSceneInfo(sceneInfo);
		params.setAttach(oid1);
		System.out.println(params);
		Map<String, String> build = params.build();
		System.out.println("build===>"+build);
		//build.put("Dingdan",oid1);
		/**
		 *直接用微信统一下单工具类,并接收返回的Xml,返回内容详见微信支付开发文档
		 */
		String xmlResult = WxPayApi.pushOrder(false, build);
		Map<String, String> result = PaymentKit.xmlToMap(xmlResult);
		System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
		System.out.println("===>1"+result);
		System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
		//返回状态码
		String return_code = result.get("return_code");
		//返回状态码
		String return_msg = result.get("return_msg");
		//业务结果
		String result_code = result.get("result_code");
		
		if (!PaymentKit.codeIsOK(return_code)){
			throw new RuntimeException(return_msg);
		}
		if (!PaymentKit.codeIsOK(result_code))
			throw new RuntimeException(return_msg);
		/**
		 *mweb_url为拉起微信支付收银台的中间页面,可通过访问该url来拉起微信客户端,完成支付,mweb_url的有效期为5分钟。
		 *直接return给前端,调用该链接会直接拉起微信支付(!!!微信外浏览器调用!!!)
		 */
		String mwebUrl = result.get("mweb_url");
		//return  mwebUrl+"&redirect_url=http://geekcjj.natapp1.cc/notify/update?oid="+oid1;
		//https://www.baidu.com/
		//response.setHeader("oid",oid1);
		return  mwebUrl;
		//+"&redirect_url=http://mkqy.natapp1.cc/notify/update?oid="+oid1;
		/*
		*
		* mwebUrl+"&redirect_url=http://mkqy.natapp1.cc/notify/update?oid="+oid1;
		* */
	}

4.WxPaidController.java

@ResponseBody
	@RequestMapping(value = "/page")
	public String notify(HttpServletRequest request) {
		//@RequestParam("oid") String oid
		// 接收微信发返回的Xml文件并转成Map<String, String>
		System.out.println("{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}");
		//System.out.println("oid===>"+oid);
		System.out.println(request);
		String xmlMsg = HttpKit.readData(request);
		Map<String, String[]> maps =  request.getParameterMap();
		System.out.println("maps===>"+maps);
		System.out.println("xmlMsg===>"+xmlMsg);
		Map<String, String> params = PaymentKit.xmlToMap(xmlMsg);
		Set<String> set=params.keySet();

		/**
		 * 常用的参数,详情参考微信支付开发文档
		 */
		//返回已经支付的订单编号
		String orderId=params.get("attach");
		// 返回状态码
		String result_code = params.get("result_code");
		// 总金额
		String total_fee = params.get("total_fee");
		// 现金支付金额
		String cash_fee = params.get("cash_fee");
		// 微信支付订单号
		String transaction_id = params.get("transaction_id");
		// 商户订单号
		String out_trade_no = params.get("out_trade_no");
		// 支付完成时间,格式为yyyyMMddHHmmss
		String time_end = params.get("time_end");
		System.out.println("已支付订单对应的编号是;"+orderId);
		System.out.println("状态码=" + result_code);
		System.out.println("总金额=" + total_fee);
		System.out.println("现金支付金额=" + cash_fee);
		System.out.println("微信支付订单号=" + transaction_id);
		System.out.println("商户订单号=" + out_trade_no);
		System.out.println("支付完成时间=" + time_end);
		/**
		 * 可以在这里判断微信返回的参数,并进行业务的处理(如做订单的状态修改等)
		 */
		System.out.println("可以在这里判断微信返回的参数,并进行业务的处理(如做订单的状态修改等)");
		OrderMaster orderMaster=orderMasterMapper.selectById(orderId);
		orderMaster.setOrderStatus(1);
		int num=orderMasterMapper.updateById(orderMaster);
		/*//System.out.println(oid);
		//开始根据oid找到对应的对象的值
		OrderMaster orderMaster=orderMasterMapper.selectById(oid);
		//通过调用set构造方法来把对象的orderstate来进行修改
		orderMaster.setOrderStatus(1);
		//调用修改的方法,把对应的值
		int num=orderMasterMapper.updateById(orderMaster);*/
		/**
		 *告诉微信我知道了,不要再给我发消息了,否则微信会8连击的反馈支付信息
		 *可以直接拼接成Xml形式的字符串,详情参考微信支付开发文档
		 */
		HashMap<String, String> result = new HashMap<String, String>();
		result.put("return_code", "SUCCESS");
		result.put("return_msg", "OK");
		String xml = PaymentKit.toXml(result);
		return xml;
	}

三.测试结果

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值