微信小程序官方文檔
下載java微信sdk
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
需要用到這4個類
1、WXPayUtil
2、HttpClientUtil
3、WXPayConstants
4、WXPayXmlUtil
封裝好的參數
public String openid;
private Long id;
private String ordersNo;
private String idCard;
需要返回給前端這些參數,然后讓其請求微信支付
appId: ""
nonceStr: ""
package: "prepay_id"
paySign: ""
signType: "MD5"
timeStamp: ""
支付接口
@RestController
@RequestMapping("/payment/")
public class PaymentController {
/*調用支付接口*/
@ApiOperation(httpMethod = "POST", value = "調用支付接口")
@RequestMapping(value = "prePay", method = RequestMethod.POST)
public Map<String, Object> prePay(@RequestBody Pay pay,HttpServletRequest request){
log.info("調用支付接口");
QueryWrapper queryWrapper = new QueryWrapper();
// 返回參數
Map<String, Object> resMap = new HashMap<>();
//獲取當前請求ip地址
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();
}
if(ip.indexOf(",")!=-1){
String[] ips = ip.split(",");
ip = ips[0].trim();
}
try {
//這里可以寫業務邏輯
if (){
if (idOrder!=null){
//如果獲取到訂單就刪除,重新生成
}
}else {
}
//前台傳輸一個openid--每個用戶對應小程序都會生成一個獨一無二的openid
Map<String, Object> paraMap = new HashMap<>();
String body = "cs";
// 封裝11個必需的參數
//小程序ID
paraMap.put("appid", environment.getProperty("appId"));
//商家ID
paraMap.put("mch_id", environment.getProperty("mchId"));
//獲取隨機字符串 Nonce Str
paraMap.put("nonce_str", WXPayUtil.generateNonceStr());
//商品名稱
paraMap.put("body", body)
Double money = hpOrder.getTotalFee();//租金
//支付金額,單位:分,這邊需要轉成字符串類型,否則后面的簽名會失敗
String totalFee= BigDecimal.valueOf(money).multiply(new BigDecimal(100)).setScale(0,BigDecimal.ROUND_HALF_UP) + "";
paraMap.put("total_fee",totalFee);
//訂單號
paraMap.put("out_trade_no", getOrderNo());
//ip地址
paraMap.put("spbill_create_ip", ip);
// 此路徑是微信服務器調用支付結果通知路徑
paraMap.put("notify_url", "http://rzk.com/payment/callBack");
//小程序和公眾號支付都是填JSAPI
paraMap.put("trade_type", "JSAPI");
paraMap.put("openid", pay.getOpenid());
String sign = WXPayUtil.generateSignature(paraMap, environment.getProperty("mchKey"));
//生成簽名. 注意,若含有sign_type字段,必須和signType參數保持一致。
paraMap.put("sign", sign);
//將所有參數(map)轉xml格式
String xml = WXPayUtil.mapToXml(paraMap);
log.info("xml=: "+xml);
// 統一下單 https://api.mch.weixin.qq.com/pay/unifiedorder
String unifiedorder_url = WXPayConstants.UNIFIEDORDER_URL;
log.info("統一下單接口unifiedorder_url:"+unifiedorder_url);
//發送post請求"統一下單接口"返回預支付id:prepay_id
String xmlStr = HttpClientUtil.doPostXml(unifiedorder_url, xml);
//以下內容是返回前端頁面的json數據
//預支付id
String prepay_id = "";
if (xmlStr.indexOf("SUCCESS") != -1) {
Map<String, Object> map = WXPayUtil.xmlToMap(xmlStr);//XML格式字符串轉換為Map
//獲取封裝好的預支付id
prepay_id = map.get("prepay_id").toString();
log.info("prepay_id_1= "+prepay_id);
}
// 封裝所需6個參數調支付頁面
Map<String, Object> payMap = new HashMap<String, Object>();
payMap.put("appId", environment.getProperty("appId"));
payMap.put("timeStamp", WXPayUtil.getCurrentTimestamp()+"");//獲取當前時間戳,單位秒
payMap.put("nonceStr", WXPayUtil.generateNonceStr());//獲取隨機字符串 Nonce Str
payMap.put("signType", "MD5");
//這里被坑,需要這樣寫 "prepay_id=" +
payMap.put("package", "prepay_id=" + prepay_id);
//生成帶有 sign 的 XML 格式字符串
String paySign = WXPayUtil.generateSignature(payMap, environment.getProperty("mchKey"));
payMap.put("paySign", paySign);
// 封裝正常情況返回數據
resMap.put("success",true);
resMap.put("payMap",payMap);
} catch (Exception e) {
//異常刪除訂單
// 封裝異常情況返回數據
log.info("調用統一訂單接口錯誤");
resMap.put("success",false);
resMap.put("message","調用統一訂單接口錯誤");
e.printStackTrace();
}
return resMap;
}
}
回調地址
/*支付成功回調*/
@ApiOperation(httpMethod = "POST", value = "調用支付成功回調的地址")
@RequestMapping(value = "callBack")
public Result callBack(HttpServletRequest request, HttpServletResponse response){
Result result = new Result();
log.info("調用微信支付成功回調");
InputStream is = null;
String resXml = "";
try {
is = request.getInputStream();//獲取請求的流信息(這里是微信發的xml格式所有只能使用流來讀)
String xml = WXPayUtil.inputStream2String(is);
Map<String, Object> notifyMap = WXPayUtil.xmlToMap(xml);//將微信發的xml轉map
if(notifyMap.get("return_code").equals("SUCCESS")){
try {
//這里寫業務邏輯
//獲取到商戶訂單號
String ordersNo = notifyMap.get("out_trade_no").toString();//商戶訂單號
log.info("訂單號"+ordersNo);
Order = iOrderService.getByIdOrder(ordersNo);
log.info("查詢租房是否有該訂單: "+hpOrder);
//如果查詢出來有
if (order!=null) {
//商戶訂單號
iOrderService.updateByIdOrders(ordersNo);
log.info("訂單狀態修改成功");
}else{
Order order = iOrderService.getByIdOrder(ordersNo);
log.info("查詢寫字樓是否有該訂單: "+order);
if (order!=null) {
//商戶訂單號
iOrderService.updateByIdOrders(ordersNo);
log.info("訂單狀態修改成功");
}
}
resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
+ "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
out.write(resXml.getBytes());
out.flush();
out.close();
System.err.println("返回給微信的值:"+resXml.getBytes());
is.close();
}catch (Exception e){
log.info("訂單狀態修改失敗");
result.setMsg("訂單狀態修改失敗");
}
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}