第三方支付公司
- 常见第三方支付公司
拉卡拉
通联 - 接入第三方的支付公司的目的
多子商户
定制需求
多码合一(微信,支付宝,银联,钱包…)
交易流程
微信支付客户 微信小程序 商户服务器 微信服务器 第三方支付公司 进入小程序下单 下单(订单信息、微信客户信息) 调用小程序登录接口wx.login返回openid(根据code获取openid) 生成待支付的订单 调用第三方支付下单接口 返回支付参数 返回支付参数 用户确认支付 调起支付 返回支付结果 推送异步支付通知 推送异步支付通知 更新订单 微信支付客户 微信小程序 商户服务器 微信服务器 第三方支付公司
- 微信小程序
appId: #小程序的appid
appSecred: #小程序的密码
code: #获取openid的标识
微信支付
商户号: #接入微信支付,分发的一个账号
第三方
客户号: #第三方系统的分发的账号
公钥(pubKey): #用在加密支付参数
回调地址: #给第三方或者微信异步推送支付的结果
异步支付通知回调接收
回调地址1、请求支付的时候带过去 2、后台配置 3、一般通知三次
- url链接返回参数
//第三方支付成功回调
@RequestMapping("/notifyWXCCBPay")
@ResponseBody
@ApiOperation("第三方支付成功回调")
public void notifyWXCCBPay(HttpServletRequest request, HttpServletResponse response) throws IOException {
log.info("第三方支付成功回调:");
String url = request.getRequestURL().toString();
String notifyURLParam = request.getQueryString();
String SUCCESS = request.getParameter("SUCCESS");
log.info("url:" + url);
log.info("notifyURLParam:" + notifyURLParam);
}
- 微信小程序支付回调
/**
* 微信小程序支付成功回调函数
*
* @param request
* @param response
* @throws Exception
*/
@ResponseBody
@RequestMapping(value = "notifyWXAppPay")
@ApiOperation("微信小程序支付成功回调函数")
public String wxNotify(HttpServletRequest request, HttpServletResponse response) throws Exception {
log.info("微信小程序支付回调");
BufferedReader br = new BufferedReader(new InputStreamReader((ServletInputStream) request.getInputStream()));
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line);
}
br.close();
//sb为微信返回的xml
String notityXml = sb.toString();
log.info("接收到的报文:" + notityXml);
MyWXPayConfig config = null;
WXPay wxpay = null;
try {
config = new MyWXPayConfig();
wxpay = new WXPay(config);
} catch (Exception e) {
e.printStackTrace();
}
Map<String, String> notityMap = wxpay.processResponseXml(notityXml);
log.info("notityMap:" + notityMap);
String return_code = (String) notityMap.get("return_code");
String result_code = (String) notityMap.get("result_code");
if ("SUCCESS".equals(return_code) && return_code.equals(result_code)) {
//判断接受到的result_code是不是SUCCESS,如果是,则返回成功,具体业务具体分析,修改订单状态
log.info("===============付款成功==============");
String total_fee = notityMap.get("total_fee");//订单总金额
String out_trade_no = notityMap.get("out_trade_no");
String tradeNo = notityMap.get("transaction_id");
String openid = notityMap.get("openid");//用户在商户appid下的唯一标识
String status = "2";
//更新订单
wXAppPayService.updateOrder(out_trade_no, status, total_fee, tradeNo, openid);
// 通知微信.异步确认成功.必写.不然会一直通知后台.
String resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>" +
"<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
return resXml; //或者 return "success";
} else {
// 小程序支付失败
log.info("小程序支付失败");
Map<String, String> reqData = new HashMap<String, String>();
reqData.put("return_code", "FAIL");
reqData.put("return_msg", "支付失败 ");
return WXPayUtil.mapToXml(reqData);
}
}