这里只写请求 回调可以采用web端 可以参考我之前写的文章
废话不多说、上代码
PayController
@Autowired
private AliPayService aliPayService;
@Autowired
private WeiXinPayService weiXinPayService;
/**
* android微信app支付
*/
@ApiOperation("app支付")
@GetMapping("/pay")
public ResultVo unifiedOrder(
@ApiParam(value = "订单号") @RequestParam String oId,
@ApiParam(value = "(0,微信/1、支付宝)") @RequestParam Integer identification,
HttpServletRequest request) {
try {
if (identification ==0){
logger.info("PayController.unifiedOrder>>>>>>>>>>>>>>>>>>{pay}微信支付请求单号:oId="+oId);
return ResultVoUtil.success(weiXinPayService.doUnifiedOrder(oId));
}else {
return ResultVoUtil.success(aliPayService.androidAliPay(oId));
}
} catch (Exception e) {
logger.error(e.getMessage());
return ResultVoUtil.error("运行异常,请联系管理员");
}
}
Server
/**
* 微信app支付
* @param
* @return
* @throws Exception
*/
Map<String,String> doUnifiedOrder(String oId);
/**
* 支付宝app支付
* @throws IOException
* @return*/
String androidAliPay(String oId) throws Exception;
impl
/**
* 微信app支付
* @param
* @return
* @throws Exception
*/
@Override
public Map<String,String> doUnifiedOrder(String oId){
try {
QueryWrapper<HOrder> wrapper = new QueryWrapper<>();
wrapper.eq("o_id",oId);
HOrder order = orderMapper.selectOne(wrapper);
String num = order.getOrderPrice().multiply(BigDecimal.valueOf(100)).setScale(0).toString();
orderService.updateOrder(order.getOId(),"微信app",0);
//WXConfigUtil configUtil = new WXConfigUtil();
WXPay wxPay = new WXPay(configUtil);
Map<String, String> data = new HashMap<>();
data.put("appid", app_id); //appid
data.put("mch_id", mch_id); //商户号
data.put("nonce_str", WXPayUtil.generateNonceStr());//随机字符串
data.put("body", "test");//商品描述
data.put("out_trade_no", oId); //商品订单号
data.put("total_fee", num); // 总金额
data.put("spbill_create_ip", spbtll_create_ip);//终端IP
data.put("notify_url", notify_url);//回调地址
data.put("trade_type", "APP");//交易类型
//附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
// data.put("datetime", String.valueOf(new Date().getTime()));
String sign = WXPayUtil.generateSignature(data,key, WXPayConstants.SignType.MD5);
data.put("sign", sign); //生成签名
String str = WXPayUtil.mapToXml(data);
logger.info("map转xml" + str);
logger.info("我给的数据是" + data);
logger.info("第一次签名------------------" + sign);
//使用官方API请求预付订单
Map<String, String> response = wxPay.unifiedOrder(data);
String returnCode = response.get("return_code"); //获取返回码
Map<String, String> param = new LinkedHashMap<>();
//判断返回状态码是否成功
if (returnCode.equals("SUCCESS")) {
//成功后接受微信返回的参数
String resultCode = response.get("result_code");
logger.info("获取返回码" + resultCode);
// logger.info("获取返回码错误代码---" + response.get("err_code") + "---获取返回码错误代码描述---" + response.get("err_code_des"));
param.put("appid", response.get("appid"));
param.put("partnerid", response.get("mch_id"));//商户号
param.put("packageValue", "Sign=WXPay");
param.put("noncestr", WXPayUtil.generateNonceStr());//随机字符串
param.put("datetime", String.valueOf(new Date().getTime())); //时间戳
if (resultCode.equals("SUCCESS")) {
param.put("prepayid", response.get("prepay_id"));//预支付交易会话ID
String retutnSign = WXPayUtil.generateSignature(param, key, WXPayConstants.SignType.MD5);
logger.info("第二次签名------------------" + retutnSign);
//说一下这个第二次的签名不是获取,而是拿着你请求微信支付回来的数据再去请求一次生成签名,方式一定要和第一次相同。
param.put("sign", retutnSign);
String str1 = WXPayUtil.mapToXml(param);
System.out.println("map转xml" + str1);
param.put("tradetype", response.get("trade_type")); //交易类型
logger.info("param=="+param);
} else {
// //此时返回没有预付订单的数据
logger.info("此时返回没有预付订单的数据");
}
} else {
logger.info("没有返回我接受到的微信参数");
}
return param;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
/**
* 支付宝支付调用接口
* @throws IOException
* @return*/
@Override
public String androidAliPay(String oId) throws Exception {
QueryWrapper wrapper = new QueryWrapper();
wrapper.eq("o_id",oId);
HOrder SOrder = orderMapper.selectOne(wrapper);
//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.gatewayurl,alipayConfig.appId,
alipayConfig.rsaPrivateKey, "json",alipayConfig.charset,
alipayConfig.alipayPublicKey,alipayConfig.signType);
//设置请求参数
AlipayTradeAppPayRequest aliPayRequest = new AlipayTradeAppPayRequest();
//请求参数
Map<String , String> map = new HashMap<>();
//订单编号
map.put("out_trade_no", SOrder.getOId());
orderService.updateOrder(SOrder.getOId(),"支付宝",0);
//编码
map.put("product_code","QUICK_MSECURITY_PAY");
//交易名
map.put("subject","test");
//总金额
map.put("total_amount",String.valueOf(SOrder.getOrderPrice()));
map.put("qr_code_timeout_express","120m");
String string = JSONObject.toJSONString(map);
logger.info("-----------json封装参数-------"+string);
aliPayRequest.setBizContent(string);
aliPayRequest.setReturnUrl(alipayConfig.returnUrl);
aliPayRequest.setNotifyUrl(alipayConfig.notifyUrl);
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(aliPayRequest);
logger.info("返回结果=" + response.getBody());
return response.getBody();
}