微信支付

一直没有怎么打理这个博客,可能是自己是还不习惯使用吧。

最近在使用微信支付接入到web项目中。

但是微信官方目前为止还没有给出Java相关的Demo。

最近使用spring mvc 的方式进行了Native方式的支付,并已成功部署到外网中。

package com.jason.utils.pay.wxpay.config;

import java.io.UnsupportedEncodingException;
import java.security.SignatureException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.Set;
import java.util.SortedMap;

import org.apache.commons.codec.digest.DigestUtils;

import com.hooman.utils.common.MD5Util;


/**
 * @author Jason
 * 
 */
public class WxPayCongfig {	
	
	//=======【基本信息设置】=====================================
	//微信公众号身份的唯一标识。审核通过后,在微信发送的邮件中查看
	public static String APPID = "";
	//受理商ID,身份标识
	public static String MCHID = "";
	//商户支付密钥Key。审核通过后,在微信发送的邮件中查看,即API密钥
	public static String KEY = "";
	//JSAPI接口中获取openid,审核后在公众平台开启开发模式后可查看
	public static String APPSECRET = "";
	
	//=======【JSAPI路径设置】===================================
	//获取access_token过程中的跳转uri,通过跳转将code传入jsapi支付页面
	public static String JS_API_CALL_URL = "http://www.domain.com/wxpay/js_api_call.html";
	
	//=======【证书路径设置】=====================================
	//证书路径,注意应该填写绝对路径
	public static String SSLCERT_PATH = WxPayCongfig.class.getClassLoader().getResource("cacert/apiclient_cert.pem").getPath();
	public static String SSLKEY_PATH = WxPayCongfig.class.getClassLoader().getResource("cacert/apiclient_key.pem").getPath();
	public static String SSLCERT12_PATH = WxPayCongfig.class.getClassLoader().getResource("cacert/apiclient_cert.p12").getPath();
	
	//=======【异步通知url设置】===================================
	//异步通知url,商户根据实际开发过程设定
	public static String NOTIFY_URL = "http://www.domain.com/wxpay/notify_url.html";
	
	//=======【调用统一支付接口,可接受JSAPI/NATIVE/APP 下预支付订单,返回预支付订单号。】============
	//NATIVE 支付返回二维码code_url。
	public static String UNIFIEDORDER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
	//NATIVE 支付返回二维码code_url,短连接地址
	public static String SHORT_URL = "https://api.mch.weixin.qq.com/tools/shorturl";
	
	/**
	 * 获取当前系统的时间
	 * @return
	 */
	public static String getCurrTime() {
		Date now = new Date();
		SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMddHHmmss");
		String s = outFormat.format(now);
		return s;
	}
	
	/**
	 * 获取当前模拟的随机订单号
	 * @return
	 */
	public static String getCurrTestOrderNo() {
		String currTime = getCurrTime();
		//8位日期
		String strTime = currTime.substring(8, currTime.length());
		//四位随机数
		String strRandom = buildRandom(4) + "";
		//10位序列号,可以自行调整。
		String strReq = strTime + strRandom;
		return strReq;
	}
	
	/**
	 * 生成随机数字
	 * @param length
	 * @return
	 */
	public static int buildRandom(int length) {
		int num = 1;
		double random = Math.random();
		if (random < 0.1) {
			random = random + 0.1;
		}
		for (int i = 0; i < length; i++) {
			num = num * 10;
		}
		return (int) ((random * num));
	}
	
	/**
	 * 随机字符串,不长于 32 位 
	 * @return
	 */
	public static String getNonceStr() {
		Random random = new Random();
		return MD5Util.MD5Encode(String.valueOf(random.nextInt(10000)), "UTF-8");
	}
	
	/**
	 * 时间戳商户生成,从 1970 年 1 月 1 日 00:00:00 至今的秒数, 即当前的时间,且最终需要 转换为字符串形式; 
	 * @return
	 */
	public static String getTimeStamp() {
		return String.valueOf(System.currentTimeMillis() / 1000);
	}
	
	/**
	 * 
	 * @param signParams
	 * @return
	 * @throws Exception
	 */
	public static String sortParams(SortedMap<String, String> signParams) {
		StringBuffer sb = new StringBuffer();
		Set<Entry<String, String>> set = signParams.entrySet();
		Iterator<Entry<String, String>> it = set.iterator();
		while (it.hasNext()) {
			Map.Entry<String, String> entry = it.next();
			String k = (String) entry.getKey();
			String v = (String) entry.getValue();
			sb.append(k + "=" + v + "&");
			//要采用URLENCODER的原始值!
		}
		String params = sb.substring(0, sb.length() - 1);
		return params;
	}
	
	/**
	 * 将传入的参数进行MD5加密
	 * @param signParams
	 * @return
	 * @throws Exception
	 */
	public static String createMD5Sign(SortedMap<String, String> signParams) throws Exception {
		StringBuffer sb = new StringBuffer(sortParams(signParams));
		String params = sb.append("&key=").append(WxPayCongfig.KEY).toString();
		System.out.println(params);
		String sign = DigestUtils.md5Hex(getContentBytes(params, "UTF-8")).toUpperCase();
		return sign;
	}
	
	
	/**
     * @param content
     * @param charset
     * @return
     * @throws SignatureException
     * @throws UnsupportedEncodingException 
     */
    private static byte[] getContentBytes(String content, String charset) {
        if (charset == null || "".equals(charset)) {
            return content.getBytes();
        }
        try {
            return content.getBytes(charset);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset);
        }
    }
}

 上面是基础的配置文件。

 

 

你可能感兴趣的:(微信)