您的位置:首页 > 移动开发 > 微信开发

JSAPI-------微信公众号支付 java 之   第一篇

2017-02-20 15:19 477 查看
做微信支付,首先要明确自己要做的事情是什么,点击支付按钮以后,出现一个输入支付密码的框


如上图所示,调出微信支付的页面,那么我们要做的事情就是调出这个框,其他事情交给微信来做

然后明确需要什么参数,通过查看微信公众号支付文档https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6
中的h5调起支付API目录,发现需要的参数有:



其中appId为微信公众平台中的账号

timeStamp由我们自己生成,在下文中会为大家提供工具类哒

noceStr由我们自己生成,在下文中会为大家提供工具类哒
package我们发现有一个叫是prepay_id的参数,那么这个参数由哪里来呢?由于这个参数相对来说比较复杂,在下文详细解释

signType为MD5

paySign是一个签名,由我们根据一些参数来生成,在下文中也会为提供工具类哒

timeStamp的工具类

/**
* 标准北京时间,时区为东八区,
* 自1970年1月1日 0点0分0秒以来的秒数。
* 注意:部分系统取到的值为毫秒级,需要转换成秒(10位数字)。
* @return String
*/
public static long getCurrTimeStamp() {
long millis = System.currentTimeMillis();//返回以毫秒为单位的当前时间
int a = (int) ((millis)*0.001);
return a;
}
noceStr的工具类

/**
* 获取一定长度的随机字符串
* @param length 指定字符串长度
* @return 一定长度的字符串
*/
public static String getRandomStringByLength(int length) {
String base = "abcdefghijklmnopqrstuvwxyz0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
int number = random.nextInt(base.length());
sb.append(base.charAt(number));
}
return sb.toString();
}
paySign工具类

/**
* 获取签名 md5加密(微信支付必须用MD5加密)
* 获取支付签名
* @param characterEncoding
* @param parameters
* @return
*/
public static String getSign(String characterEncoding,SortedMap<Object,Object> parameters){
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)
Iterator it = es.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String k = (String)entry.getKey();
Object v = entry.getValue();
if(null != v && !"".equals(v)
&& !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + Key);
String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
return sign;
}
MD5Util
public class MD5Util {
private static String byteArrayToHexString(byte b[]) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < b.length; i++)
resultSb.append(byteToHexString(b[i]));

return resultSb.toString();
}

private static String byteToHexString(byte b) {
int n = b;
if (n < 0)
n += 256;
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}

public static String MD5Encode(String origin, String charsetname) {
String resultString = null;
try {
resultString = new String(origin);
MessageDigest md = MessageDigest.getInstance("MD5");
if (charsetname == null || "".equals(charsetname))
resultString = byteArrayToHexString(md.digest(resultString
.getBytes()));
else
resultString = byteArrayToHexString(md.digest(resultString
.getBytes(charsetname)));
} catch (Exception exception) {
}
return resultString;
}
private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
}
好,到此为止就剩下package参数没有解决啦,下面详细解释
通过查看微信公众号支付文档https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
中的统一下单文档发现有我们需要的prepay_id这个参数,但是需要好多参数呀,没办法慢慢来吧,













我的天呀,这么多参数,小编就先把一些必填的的参数解释下
appid微信公众平台分配的账号 mch_id微信商户平台分配的账号 nonce_str由工具类直接生成就ok sign我擦,这个参数又是什么鬼,别急,准备在下一篇博文中解释,欢迎查看和关注哦 body先随便按照格式写一个吧 out_trade_no不多说,还是工具类 total_fee自己随便一个呗,但是注意单位必须为分,微信小提示,写少一点,因为最后一般是要你来支付测试哒 pbill_create_ip不多说,工具类 notify_url自己随便写一个喽,用来接收用户支付成功,微信服务器的提示 trade_type为JSAPI openid我擦,这个参数又是什么鬼,别急,准备在下一篇博文中解释,欢迎查看和关注哦
行了,先把工具类送给大家

sign工具类

/**
* 获取签名 md5加密(微信支付必须用MD5加密)
* 获取支付签名
* @param characterEncoding
* @param parameters
* @return
*/
public static String getSign(String characterEncoding,SortedMap<Object,Object> parameters){
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)
Iterator it = es.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String k = (String)entry.getKey();
Object v = entry.getValue();
if(null != v && !"".equals(v)
&& !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + Key);
String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
return sign;
}
out_trade_no工具类

/**
* 获取当前时间 yyyyMMddHHmmss
* @return String
*/
public static String getCurrTime() {
Date now = new Date();
SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String s = outFormat.format(now);
return s;
}
String out_trade_no = getCurrTime()+getRandomStringByLength(15);
pbill_create_ip工具类
//获取用户ip地址
private String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
好了,还差sign和openid这个两个参数啦,其他参数都ok啦,在下一篇博客中等你哦.

做微信公众号支付,需要注册微信公众平台服务号,并申请微信商户平台,来获取接口权限
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  支付 微信