微信的支付是麻烦,但支付很简单
直接上代码
有详细注释
一共四个文件
重点 调用微信提现
import back.minsu.configure.Token;
import back.minsu.param.TiXianParam;
import back.minsu.param.WxParam;
import back.minsu.result.TokenRes;
import back.minsu.utils.Result;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* @author: 云
* @date: 2020/9/21 14:10
* @version: 1.0
*/
@RestController
@RequestMapping("wxtixian")
public class WxController {
//调用提现接口
@PostMapping(value = "cash")
public Result cash() throws Exception {
// 返回结果 调用提现 这里你后期自己填值,我先写死了
String money = "写金额,已元为单位不能小于1块,不然提不出";
String str = WxAppPay.cash(money );
return Result.ok("data", str);
}
//回调 但好像没用到,就这样放着吧 我拿了支付的回调,哈哈
@PostMapping(value = "notify")
public String wxPayNotify(HttpServletRequest request) {
String resXml = "";
System.out.println("---------------");
System.out.println("---------------");
System.out.println("---------------");
try {
InputStream inputStream = request.getInputStream();
//将InputStream转换成xmlString
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
} finally {
try {
inputStream.close();
} catch (IOException e) {
}
}
resXml = sb.toString();
//String result = wxPayService.payBack(resXml);
return "result";
} catch (Exception e) {
// System.out.println("微信手机支付失败:" + e.getMessage());
String result = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
return result;
}
}
}
这里插一句,因为是静态调用,所以需要静态的调用serive层,才能执行提现成功后的逻辑实现
解决办法→https://blog.csdn.net/qq_45777315/article/details/107369039
重点 提现代码
import back.minsu.param.WxParam;
import back.minsu.service.UserService;
import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayConfig;
import com.github.wxpay.sdk.WXPayConstants;
import com.github.wxpay.sdk.WXPayUtil;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
/**
* @author: 云
* @date: 2020/9/21 11:58
* @version: 1.0
*/
public class WxAppPay {
public static String cash(String money) throws Exception {
//都是拿WxPayConfigImpl 里面的东西
WXPayConfig config = new WxPayConfigImpl();
SortedMap<String, String> paramMap = new TreeMap<String, String>();
paramMap.put("mch_appid", config.getAppID());
paramMap.put("mchid", config.getMchID());
paramMap.put("nonce_str", WXPayUtil.generateNonceStr());
//提现的订单,恶意刷的可以找回
String order = "C" + System.currentTimeMillis();
paramMap.put("partner_trade_no", order);
paramMap.put("openid", "微信的openid");
paramMap.put("check_name", "NO_CHECK");
/**
* 这里我 就遇到了很多坑,经常报错 金额的可是不对,
* 有时候你的程序提现需要手续费,这时候你的金额是需要用double来计算的
* 下面的代码是你计算完取证方法
* BigDecimal total = new BigDecimal(money).multiply(new BigDecimal(100))
* .setScale(0);
* 比如 你提100,程序手续费3% 100-100*3%=97.00 注意因为double就算是整数后面还是有小数
* 这样你这里给微信提现的时候就会多后面的 .00 用上去整就可以就解决掉
*/
//转换 类型 这里可以去百度下,如果这样写会报错 金额的格式错误
BigDecimal total = new BigDecimal(money).multiply(new BigDecimal(100));
paramMap.put("amount", total.toString());
paramMap.put("desc", "提现");
//这里就是在上个代码里面的回调地址 没啥用
paramMap.put("spbill_create_ip", "http://112.126.88.00:8083/wxtixian/notify");
String sign = WXPayUtil.generateSignature(paramMap, config.getKey(), WXPayConstants.SignType.MD5);
paramMap.put("sign", sign);
WXPay pay = new WXPay(config);
String url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
Map<String, String> resMap;
String xmlStr = pay.requestWithCert(url, paramMap, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs());
System.out.println();
System.out.println("---------");
System.out.println(xmlStr);
System.out.println("---------");
System.out.println();
//调用解析xml工具
resMap = XmlUtil.readStringXmlOut(xmlStr);
System.out.println();
System.out.println("---------");
System.out.println(resMap);
System.out.println("---------");
System.out.println();
//判断 返回的里面有没有SUCCESS 代表成功
String resultCode = resMap.get("result_code");
if ("SUCCESS".equalsIgnoreCase(resultCode)) {
//走到这里就是提现操作成功了,可以做你自己的业务逻辑了、
System.out.println();
System.out.println("---------");
System.out.println("成功了");
System.out.println("---------");
System.out.println();
//自己的提现操作记录什么的
//自己的提现操作记录什么的
//自己的提现操作记录什么的
return "成功";
} else {
String err_code = resMap.get("err_code");
if ("SYSTEMERROR".equalsIgnoreCase(err_code)) {
return err_code + "";
} else if ("NOTENOUGH".equalsIgnoreCase(err_code)) {
return err_code + "";
} else {
//在这把两个常见的错提了出来,剩下的统一为未知错误了,如果做个更好一些可以直接传错误信息。
return "调用微信提现接口未知错误,请联系管理员!";
}
}
}
}
配置WXPayConfigImpl
import com.github.wxpay.sdk.WXPayConfig;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
/**
* @author: 云
* @date: 2020/9/21 11:43
* @version: 1.0
* 配置WXPayConfigImpl
*/
public class WxPayConfigImpl implements WXPayConfig {
private byte[] certData = null;
public WxPayConfigImpl() {
try {
//这个证书的位置不是瞎鸡儿填的,你要在这个路径真的有一个证书
InputStream is = new FileInputStream("/www/wwwroot/minsu/cret/apiclient_cert.p12");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] bs = new byte[1024];
int cnt = -1;
while ((cnt = is.read(bs)) != -1) {
baos.write(bs, 0, cnt);
}
is.close();
certData = baos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public String getAppID() {
return "APPID";
}
@Override
public String getMchID() {
return "商户号";
}
@Override
public String getKey() {
return "KEY";
}
@Override
public InputStream getCertStream() {
ByteArrayInputStream certBis;
certBis = new ByteArrayInputStream(this.certData);
return certBis;
}
@Override
public int getHttpConnectTimeoutMs() {
// TODO Auto-generated method stub
return 8000;
}
@Override
public int getHttpReadTimeoutMs() {
// TODO Auto-generated method stub
return 10000;
}
}
解析xml工具类
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* zyh
* 解析微信返回的xml 看是否成功
*/
public class XmlUtil {
public static Map<String, String> readStringXmlOut(String xml) {
Map<String, String> map = new HashMap<String, String>();
Document doc = null;
try {
doc = DocumentHelper.parseText(xml); // 将字符串转为XML
Element rootElt = doc.getRootElement(); // 获取根节点
List<Element> list = rootElt.elements();//获取根节点下所有节点
for (Element element : list) { //遍历节点
map.put(element.getName(), element.getText()); //节点的name为map的key,text为map的value
}
} catch (DocumentException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
}
微信APP支付https://blog.csdn.net/qq_45777315/article/details/106414362