java微信公众号支付相关说明

Posted jiangzhongwei_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java微信公众号支付相关说明相关的知识,希望对你有一定的参考价值。

一. 微信支付配置

如下图,找到微信支付“开发配置”:



  • http://htyundai.com/jfinal-weixin-demo/pay/对应后台处理微信支付逻辑的路径,前台js主要代码如下:

  • //微信支付
     $("#li_wepay").click(function()
          var expense = 10;
          var url = contextPath + "/pay";
      	  $.post(url,
      				expense : expense,
      			,function(result)
      			  WeixinJSBridge.invoke('getBrandWCPayRequest',
      					
      				 	 "appId":result.appId,
      				 	  "timeStamp":result.timeStamp,
      				 	  "nonceStr":result.nonceStr, //随机串     
      			          "package":result.package,     
      			          "signType":result.signType,         //微信签名方式:     
      			          "paySign":result.paySign //微信签名 
      			  		,
      					function(res)
      			  			//getProes(res);
      			  			//支付成功或失败前台判断
      						if(res.err_msg=='get_brand_wcpay_request:ok')
      						     window.location.href = contextPath+"/pay_finish.jsp";
      						   	  
      					);
      		  ,'json');
     	);
    个人觉得如果条件允许,不必使用测试授权目录和测试白名单,因为以后移植的时候可能导致错误。
  • 值得注意的是,由于android机微信开发,错误提示得非常不明显,笔者建议直接获取支付返回的“res”对象,将里面的属性全部弹出,就知道哪里出错了!

  • 二.  微信支付主要后台代码
  • 2.1 微信支付后台主接口
  • 调用微信支付方法:
  • /**
    	 * 微信支付配置
    	 * @param money
    	 * @param orderid
    	 * @return
    	 */
    	public String handleWePay(String money,String orderid) 
    		//微信支付jsApi
    		WxPayDto tpWxPay = new WxPayDto();
    		tpWxPay.setOpenId(CookieUtils.getCookieByName(getRequest(), "openid"));
    		tpWxPay.setBody("商品信息");
    		//订单号
    		tpWxPay.setOrderId(orderid);
    		tpWxPay.setSpbillCreateIp("127.0.0.1");
    		//TODO 暂时设为1分方便测试 money
    		tpWxPay.setTotalFee("0.01");
    		//tpWxPay.setTotalFee(money);
    	   return ""+PayUtils.getPackage(tpWxPay)+"";
    	
    封装的WxPayDto类:
  • package com.cbj.entity;
    
    
    public class WxPayDto 
    
    	private String orderId;//订单号
    	private String totalFee;//金额
    	private String spbillCreateIp;//订单生成的机器 IP
    	private String notifyUrl;//这里notify_url是 支付完成后微信发给该链接信息,可以判断会员是否支付成功,改变订单状态等
    	private String body;// 商品描述根据情况修改
    	private String openId;//微信用户对一个公众号唯一
    	
    	/**
    	 * @return the orderId
    	 */
    	public String getOrderId() 
    		return orderId;
    	
    	/**
    	 * @param orderId the orderId to set
    	 */
    	public void setOrderId(String orderId) 
    		this.orderId = orderId;
    	
    	/**
    	 * @return the totalFee
    	 */
    	public String getTotalFee() 
    		return totalFee;
    	
    	/**
    	 * @param totalFee the totalFee to set
    	 */
    	public void setTotalFee(String totalFee) 
    		this.totalFee = totalFee;
    	
    	/**
    	 * @return the spbillCreateIp
    	 */
    	public String getSpbillCreateIp() 
    		return spbillCreateIp;
    	
    	/**
    	 * @param spbillCreateIp the spbillCreateIp to set
    	 */
    	public void setSpbillCreateIp(String spbillCreateIp) 
    		this.spbillCreateIp = spbillCreateIp;
    	
    	/**
    	 * @return the notifyUrl
    	 */
    	public String getNotifyUrl() 
    		return notifyUrl;
    	
    	/**
    	 * @param notifyUrl the notifyUrl to set
    	 */
    	public void setNotifyUrl(String notifyUrl) 
    		this.notifyUrl = notifyUrl;
    	
    	/**
    	 * @return the body
    	 */
    	public String getBody() 
    		return body;
    	
    	/**
    	 * @param body the body to set
    	 */
    	public void setBody(String body) 
    		this.body = body;
    	
    	/**
    	 * @return the openId
    	 */
    	public String getOpenId() 
    		return openId;
    	
    	/**
    	 * @param openId the openId to set
    	 */
    	public void setOpenId(String openId) 
    		this.openId = openId;
    	
    	
    
    
    PayUtils中的getPackage方法:
  • /**
    	 * 获取请求预支付id报文
    	 * @return
    	 */
    	@SuppressWarnings("static-access")
    	public static String getPackage(WxPayDto tpWxPayDto) 
    		
    		String openId = tpWxPayDto.getOpenId();
    		// 1 参数
    		// 订单号
    		String orderId = tpWxPayDto.getOrderId();
    		// 附加数据 原样返回
    		String attach = "";
    		// 总金额以分为单位,不带小数点
    		String totalFee = getMoney(tpWxPayDto.getTotalFee());
    		
    		// 订单生成的机器 IP
    		String spbill_create_ip = tpWxPayDto.getSpbillCreateIp();
    		// 这里notify_url是 支付完成后微信发给该链接信息,可以判断会员是否支付成功,改变订单状态等。
    		String trade_type = "JSAPI";
    
    		// ---必须参数
    		// 商户号
    		String mch_id = PropKit.get("mch_id");
    		// 随机字符串
    		String nonce_str = SignUtil.getNonceStr();
    
    		// 商品描述根据情况修改
    		String body = tpWxPayDto.getBody();
    
    		// 商户订单号
    		String out_trade_no = orderId;
    		String appid = PropKit.get("appId");
    		SortedMap<String, String> packageParams = new TreeMap<String, String>();
    		packageParams.put("appid", appid);
    		packageParams.put("mch_id", mch_id);
    		packageParams.put("nonce_str", nonce_str);
    		packageParams.put("body", body);
    		packageParams.put("attach", attach);
    		packageParams.put("out_trade_no", out_trade_no);
    
    		packageParams.put("total_fee", totalFee);
    		packageParams.put("spbill_create_ip", spbill_create_ip);
    		packageParams.put("notify_url", notify_url);
    
    		packageParams.put("trade_type", trade_type);
    		packageParams.put("openid", openId);
    
    		RequestHandler reqHandler = new RequestHandler(null, null);
    		reqHandler.init(appid, PropKit.get("appSecret"), PropKit.get("paternerKey"));
    
    		String sign = reqHandler.createSign(packageParams);
    		String xml = "<xml>" + "<appid>" + appid + "</appid>" + "<mch_id>"
    				+ mch_id + "</mch_id>" + "<nonce_str>" + nonce_str
    				+ "</nonce_str>" + "<sign>" + sign + "</sign>"
    				+ "<body><![CDATA[" + body + "]]></body>" 
    				+ "<out_trade_no>" + out_trade_no
    				+ "</out_trade_no>" + "<attach>" + attach + "</attach>"
    				+ "<total_fee>" + totalFee + "</total_fee>"
    				+ "<spbill_create_ip>" + spbill_create_ip
    				+ "</spbill_create_ip>" + "<notify_url>" + notify_url
    				+ "</notify_url>" + "<trade_type>" + trade_type
    				+ "</trade_type>" + "<openid>" + openId + "</openid>"
    				+ "</xml>";
    		String prepay_id = "";
    		String createOrderURL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
    		
    		
    		prepay_id = new GetWxOrderno().getPayNo(createOrderURL, xml);
    
    		System.out.println("获取到的预支付ID:" + prepay_id);
    		
    		
    		//获取prepay_id后,拼接最后请求支付所需要的package
    		
    		SortedMap<String, String> finalpackage = new TreeMap<String, String>();
    		String timestamp = Sha1Util.getTimeStamp();
    		String packages = "prepay_id="+prepay_id;
    		finalpackage.put("appId", appid);  
    		finalpackage.put("timeStamp", timestamp);  
    		finalpackage.put("nonceStr", nonce_str);  
    		finalpackage.put("package", packages);  
    		finalpackage.put("signType", "MD5");
    		//要签名
    		String finalsign = reqHandler.createSign(finalpackage);
    		
    		String finaPackage = "\\"appId\\":\\"" + appid + "\\",\\"timeStamp\\":\\"" + timestamp
    		+ "\\",\\"nonceStr\\":\\"" + nonce_str + "\\",\\"package\\":\\""
    		+ packages + "\\",\\"signType\\" : \\"MD5" + "\\",\\"paySign\\":\\""
    		+ finalsign + "\\"";
    		
    		System.out.println("V3 jsApi package:"+finaPackage);
    		
    		return finaPackage;
    	
  • 转换金额的getMoney方法:
  • 	/**
    	 * 元转换成分
    	 * @param money
    	 * @return
    	 */
    	public static String getMoney(String amount) 
    		if(amount==null)
    			return "";
    		
    		// 金额转化为分为单位
    		String currency =  amount.replaceAll("\\\\$|\\\\¥|\\\\,", "");  //处理包含, ¥ 或者$的金额  
            int index = currency.indexOf(".");  
            int length = currency.length();  
            int amLong = 0;  
            if(index == -1)  
                amLong = Integer.valueOf(currency+"00");  
            else if(length - index >= 3)  
                amLong = Integer.valueOf((currency.substring(0, index+3)).replace(".", ""));  
            else if(length - index == 2)  
                amLong = Integer.valueOf((currency.substring(0, index+2)).replace(".", "")+0);  
            else  
                amLong = Integer.valueOf((currency.substring(0, index+1)).replace(".", "")+"00");  
              
            System.out.println("预支付金额:"+amLong);
            return amLong+""; 
    	
    未完待续。。。

以上是关于java微信公众号支付相关说明的主要内容,如果未能解决你的问题,请参考以下文章

微信支付之扫码支付公众号支付H5支付小程序支付相关业务流程分析总结

java开发微信扫码支付,怎么做测试,公众账号ID,商户号这些怎么来?

2017-9月微信公众号支付-Java详解

微信支付

微信公众号JSAPI网页支付

微信开发---- 公众号支付