個人資源與分享網站:http://xiaocaoshare.com/
微信開發者平臺網址:https://open.weixin.qq.com/
微信支付開發前要先去開發者平臺創建移動應用,獲取APPID和祕鑰,然後申請獲取支付接口能力(個人無法申請,必須企業才能申請),申請商戶號
業務流程:
後臺主要做的接口:
1.調用微信的統一下單接口,獲取預支付訂單支付信息和簽名
2.支付成功回調接口的處理
/**
* 微信支付接口(調用統一下單接口)
*
* @param totalAmount
* 總金額
* @param description
* 商品描述
* @param request
* @return
* @throws UnsupportedEncodingException
*/
@ApiOperation(value = "獲取預付單信息和簽名")
@GetMapping("getSign")
@ResponseBody
public ErrorObject getSign(@RequestParam BigDecimal totalAmount, @RequestParam String description, String deedsn,
HttpServletRequest request) throws UnsupportedEncodingException {
ErrorObject error = new ErrorObject();
// 訂單號
String tradeNo = UUID.randomUUID().toString().replaceAll("-", "").toLowerCase().substring(0, 32);
// 回調地址
String notifyUrl = currentPath + "/api/v2/wx/json/money/wxpay/succ";
// 自定義參數
Long userId = 100L; // 對應用戶id自己修改
JSONObject jsAtt = new JSONObject();
jsAtt.put("uid", userId);
String attach = jsAtt.toJSONString();
// 返回預支付參數
SortedMap<String, Object> map = new TreeMap<>();
map = PayCommonUtil.WxPublicPay(tradeNo, totalAmount, description, attach, notifyUrl, request);
WxPayDto dto = new WxPayDto();
dto.setAppid((String) map.get("appId"));
dto.setPartnerid((String) map.get("partnerid"));
dto.setPrepayid((String) map.get("prepayid"));
dto.setPackage((String) map.get("package"));
dto.setNoncestr((String) map.get("nonceStr"));
dto.setTimestamp(map.get("timeStamp") + "");
// 獲取二次簽名sign
SortedMap<String, Object> parameterMap = new TreeMap<>();
parameterMap.put("appid", dto.getAppid());
parameterMap.put("noncestr", dto.getNoncestr());
parameterMap.put("package", dto.getPackage());
parameterMap.put("partnerid", dto.getPartnerid());
parameterMap.put("prepayid", dto.getPrepayid());
parameterMap.put("timestamp", dto.getTimestamp());
String sign = PayToolUtil.createSign("UTF-8", parameterMap, PayCommonUtil.API_KEY);
dto.setSign(sign);
error.setMap(UtilPublic.toModelMap(dto));
// 生成訂單
TblOrder order = new TblOrder();
order.setBizOrderNo(tradeNo);// 訂單號
order.setPayStatus((byte) 0);
order.setAmount(totalAmount.longValue());// 商品金額
order.setGoodsName(description);// 商品名稱
order.setDeedsn(deedsn);
TblUser user = TblUserHelper.currentUser();
if (user == null) {
error.setSuccess(false);
error.setMsg("token失效,請重新登錄!");
return error;
}
order.setUid(user.getUid());
tblOrderService.save(order);
return error;
}
@ApiOperation(value = "支付成功回調地址")
@PostMapping("/json/money/wxpay/succ")
public String wxpaySucc(HttpServletRequest request) throws IOException {
log.info("微信支付成功異步通知參數:");
InputStream inStream = request.getInputStream();
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
}
String resultxml = new String(outSteam.toByteArray(), "utf-8");
Map<String, String> params = null;
try {
params = PayCommonUtil.doXMLParse(resultxml);
} catch (JDOMException e) {
e.printStackTrace();
}
outSteam.close();
inStream.close();
if (!PayCommonUtil.isTenpaySign(params)) {
// 支付失敗
return "fail";
} else {
log.info("===============付款成功==============");
// ------------------------------
// 處理業務開始
// ------------------------------
// 此處處理訂單狀態,結合自己的訂單數據完成訂單狀態的更新
// ------------------------------
log.warn("微信付款成功:");
log.warn("微信支付成功異步通知參數:");
String total_fee = params.get("total_fee");// 總金額
log.warn("total_fee= {}", total_fee);
double v = Double.valueOf(total_fee) / 100;
// 取出用戶id
String attach = params.get("attach");
String out_trade_no = params.get("out_trade_no");// 商戶訂單號
String openid = params.get("openid");
log.warn("out_trade_no= {}", out_trade_no);
log.warn("openid= {}", openid);
TblOrder order = tblOrderService.findByBizOrderNo(out_trade_no);
order.setPayStatus((byte) 1);
tblOrderService.save(order);
// TODO修改合同狀態並同步到erp
return "success";
}
}
完整代碼的截圖: