java服务器端微信、支付宝支付和退款功能服务器端微信、支付宝支付和退款功能
主要为大家详细介绍了java服务器端微信、支付宝支付和退款功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
工作需要,写了服务器端的支付和退款功能,包含微信和支付宝,网上也有很多demo可以借鉴,我把我的代码放出来,写的比较简单,有问题的欢迎指正,大家一
起学习。
微信支付需要调用微信的统一下单接口,而支付宝不用。
我写的时候微信和支付宝都单独写了一个工具类,来调用支付,给前端返回需要的数据。
ps:支付是可以不需要服务器端的,不过为了安全一点点,所以前端需要调起支付的字段都直接从服务器端返回,前端拿到字段直接调起支付就可以了。
Map<String,String> map = new HashMap<String,String>();
switch (record.getCheckType()) {
case 10:
map = Alipay.prePay(record.getAmount(),out_trade_no);
return ResponseData.ok(map);
case 20:
map = WXPay.prePay(record.getAmount(),out_trade_no);
return ResponseData.ok(map);
}
10是支付宝支付,20是微信支付,map里存放前端需要的字段,直接返回给手机端
其中out_trade_no这个是商户自己生成的唯一订单号
public class WXPay {
private static String url = String.format("https://api.mch.weixin.qq.com/pay/unifiedorder");
//统一下单
public static Map<String,String> prePay(BigDecimal amount,String out_trade_no){
String entity = genProductArgs(amount,out_trade_no);
byte[] buf = Util.httpPost(url, entity);
String content = new String(buf);
Map<String,String> xml=decodeXml(content);
return getRep(xml);
}
private static Map<String, String> getRep(Map<String, String> xml) {
Random random = new Random();
List<NameValuePair> signParams = new LinkedList<NameValuePair>();
signParams.add(new BasicNameValuePair("appid", Constants.APP_ID_WX));
signParams.add(new BasicNameValuePair("noncestr", MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes())));
// signParams.add(new BasicNameValuePair("package", "prepay_id="+xml.get("prepay_id")));
signParams.add(new BasicNameValuePair("package", "Sign=WXPay"));
signParams.add(new BasicNameValuePair("partnerid", Constants.MCH_ID));
signParams.add(new BasicNameValuePair("prepayid", xml.get("prepay_id")));
signParams.add(new BasicNameValuePair("timestamp", String.valueOf(System.currentTimeMillis() / 1000)));
xml.put("sign", genPackageSign(signParams));
for (int i = 0; i < signParams.size(); i++) {
xml.put(signParams.get(i).getName(),signParams.get(i).getValue());
}
return removeElements(xml);
}
private static Map<String, String> removeElements(Map<String, String> xml) {
xml.remove("appid");
xml.remove("mch_id");
xml.remove("nonce_str");
xml.remove("trade_type");
//xml.remove("partnerid");
xml.remove("prepay_id");
xml.remove("result_code");
xml.remove("return_code");
xml.remove("return_msg");
return xml;
}
private static String genProductArgs(BigDecimal amount,String out_trade_no) {
StringBuffer xml = new StringBuffer();
String nonceStr = genNonceStr();
xml.append("</xml>");
List<NameValuePair> packageParams = new LinkedList<NameValuePair>();
packageParams.add(new BasicNameValuePair("appid", Constants.APP_ID_WX));
packageParams.add(new BasicNameValuePair("body", "APP pay test"));
packageParams.add(new BasicNameValuePair("mch_id", Constants.MCH_ID));
packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));
packageParams.add(new BasicNameValuePair("notify_url", "填写服务器的支付回调路径"));
packageParams.add(new BasicNameValuePair("out_trade_no",out_trade_no));
packageParams.add(new BasicNameValuePair("spbill_create_ip","127.0.0.1"));
packageParams.add(new BasicNameValuePair("total_fee", String.valueOf(amount.movePointRight(2))));
// packageParams.add(new BasicNameValuePair("total_fee", "1"));
packageParams.add(new BasicNameValuePair("trade_type", "APP"));
String sign = genPackageSign(packageParams);
packageParams.add(new BasicNameValuePair("sign", sign));
String xmlstring =toXml(packageParams);
return xmlstring;
}
public static String genNonceStr() {
Random random = new Random();
return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
}