最近刚接触微信小程序项目,踩了几个坑,以此记录一下
1、微信小程序需要绑定商户 【mch_id=商户号】
2、调用统一接口部分代码
public Map<String,String> pay(){
//微信统一下单URL
String payUrl="https://api.mch.weixin.qq.com/pay/unifiedorder";
Map<String, String> map = new HashMap<>();
map.put("appid", ""); //小程序appid
map.put("body", ""); //商品描述
map.put("mch_id", ""); //商户号
map.put("nonce_str", ""); //32位随机码
map.put("out_trade_no", ""); //订单号
map.put("openid", ""); //小程序用户openid
map.put("total_fee", "");//费用
map.put("spbill_create_ip", ""); //ip地址
map.put("notify_url", "");//回调URL
map.put("trade_type", "JSAPI"); //支付方式
//使用ASKII码进行排序
String stringA = formatUrlMap(map, false, false);
//加上+key,并转换成大写
String sign = MD5Util.toMD5String(stringA+"&key=").toUpperCase();
String xml = "<xml>" + "<appid>"
+appid + "</appid>"
+ "<body>"+body+"</body>"
+ "<mch_id>" + mchid + "</mch_id>"
+ "<nonce_str>" + nonceStr + "</nonce_str>"
+ "<notify_url>" + url+ "</notify_url>"
+ "<openid>" + openId + "</openid>"
+ "<out_trade_no>" + orderid + "</out_trade_no>"
+ "<spbill_create_ip>"+ipAds+"</spbill_create_ip>"
+ "<total_fee>" + money + "</total_fee>"
+ "<trade_type>JSAPI</trade_type>"
+ "<sign>" + sign + "</sign>"
+ "</xml>";
//获得返回结果
String result = HttpClass.httpRequest(payUrl, "POST", xml);
//解析字符串 获取prepay_id
//将参数返回给前端小程序
return map;
}
*此处注意:上面签名的字符串个数必须要和 XML的 个数,名称一一对应,不然会返回 “签名错误”
/**
* 方法用途: 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序),并且生成url参数串
* 实现步骤:
* @param paraMap 要排序的Map对象
* @param urlEncode 是否需要URLENCODE
* @param keyToLower 是否需要将Key转换为全小写
* true:key转化成小写,false:不转化
* @return
*/
private static String formatUrlMap(Map<String, String> paraMap, boolean urlEncode, boolean keyToLower){
String buff = "";
Map<String, String> tmpMap = paraMap;
try{
List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>(tmpMap.entrySet());
// 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)
Collections.sort(infoIds, new Comparator<Map.Entry<String, String>>(){
@Override
public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2){
return (o1.getKey()).toString().compareTo(o2.getKey());
}
});
// 构造URL 键值对的格式
StringBuilder buf = new StringBuilder();
for (Map.Entry<String, String> item : infoIds){
if (StringUtils.isNotBlank(item.getKey())){
String key = item.getKey();
String val = item.getValue();
if (urlEncode){
val = URLEncoder.encode(val, "utf-8");
}
if (keyToLower){
buf.append(key.toLowerCase() + "=" + val);
} else {
buf.append(key + "=" + val);
}
buf.append("&");
}
}
buff = buf.toString();
if (buff.isEmpty() == false) {
buff = buff.substring(0, buff.length() - 1);
}
} catch (Exception e){
return null;
}
return buff;
}
/**
* @param requestUrl请求地址
* @param requestMethod请求方法
* @param outputStr参数
*/
public static String httpRequest(String requestUrl,String requestMethod,String outputStr){
// 创建SSLContext
StringBuffer buffer = null;
try{
URL url = new URL(requestUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(requestMethod);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.connect();
//往服务器端写内容
if(null !=outputStr){
OutputStream os=conn.getOutputStream();
os.write(outputStr.getBytes("utf-8"));
os.close();
}
// 读取服务器端返回的内容
InputStream is = conn.getInputStream();
InputStreamReader isr = new InputStreamReader(is, "utf-8");
BufferedReader br = new BufferedReader(isr);
buffer = new StringBuffer();
String line = null;
while ((line = br.readLine()) != null) {
buffer.append(line);
}
br.close();
}catch(Exception e){
e.printStackTrace();
}
return buffer.toString();
}
微信支付接口签名校验工具:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1
微信公众平台支付接口调试工具:https://pay.weixin.qq.com/wiki/tools/signverify/
中间有借鉴其他人的代码