首页 > 编程语言 > 详细

JAVA支付对接

时间:2021-03-06 23:50:43      阅读:27      评论:0      收藏:0      [点我收藏+]

支付宝支付

  • 依赖

        <!-- 支付宝必须 -->
       <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>fastjson</artifactId>
           <version>1.2.6</version>
       </dependency>
       <dependency>
           <groupId>commons-logging</groupId>
           <artifactId>commons-logging</artifactId>
           <version>1.2</version>
       </dependency>
       <dependency>
           <groupId>com.alipay.sdk</groupId>
           <artifactId>alipay-sdk-java</artifactId>
           <version>4.7.11.ALL</version>
       </dependency>
       <!-- 支付宝必须 -->
  • 工具类

package com.ruoyi.web.controller.pay;
?
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
?
@Component
public class AliPayTool {
   // 商户appid
   public static final String APP_ID = "xx";
//   公钥
   public static final String PUBLIC_KEY ="xx";
//   私钥
   public static final String PRIVATE_KEY = "xx";
   // 返回格式
   public static final String FORMAT = "json";
   // 编码
   public static final String CHARSET = "UTF-8";
   // RSA2
   public static final String SIGNTYPE = "RSA2";
?
   //   支付客户端
   private static AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, PRIVATE_KEY, FORMAT, CHARSET, PUBLIC_KEY, SIGNTYPE);
?
   /**
    * app支付
    */
   @Transactional(rollbackFor = Exception.class)
   public String appPay(AlipayTradeAppPayModel model) {
//       实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
       AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
       request.setBizModel(model);
//       回调地址
//       request.setNotifyUrl("http://bangde.bajiaostar.com/ano/aliPayNotify");
       request.setNotifyUrl("http://localhost:8099/ano/aliPayNotify");
       try {
           //这里和普通的接口调用不同,使用的是sdkExecute
           AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
           return response.getBody();
      } catch (AlipayApiException e) {
           e.printStackTrace();
      }
       return "支付生成失败";
  }
}
  • PayNotifyController

package com.ruoyi.web.controller.pay;
?
       import com.alipay.api.AlipayApiException;
       import com.alipay.api.internal.util.AlipaySignature;
       import com.ijpay.core.kit.WxPayKit;
       import com.ruoyi.common.core.domain.AjaxResult;
       import com.ruoyi.common.cyz.pay.WxPayUtil;
       import io.swagger.annotations.Api;
       import lombok.extern.slf4j.Slf4j;
       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.servlet.http.HttpServletRequest;
       import java.io.UnsupportedEncodingException;
       import java.math.BigDecimal;
       import java.text.SimpleDateFormat;
       import java.util.HashMap;
       import java.util.Iterator;
       import java.util.Map;
       import java.text.ParseException;
?
@Slf4j
@RequestMapping("/ano")
@RestController
@Api(tags = "支付回调接口")
public class PayNotifyController {
?
   @PostMapping("/aliPayNotify")
   public AjaxResult aliPayNotify(HttpServletRequest request) throws UnsupportedEncodingException {
       System.out.println("====================支付回调====================");
//       //获取支付宝POST过来反馈信息
       Map<String, String> params = new HashMap<String, String>();
       Map requestParams = request.getParameterMap();
       for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
           String name = (String) iter.next();
           String[] values = (String[]) requestParams.get(name);
           String valueStr = "";
           for (int i = 0; i < values.length; i++) {
               valueStr = (i == values.length - 1) ? valueStr + values[i]
                      : valueStr + values[i] + ",";
          }
           //乱码解决,这段代码在出现乱码时使用。
           //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
           params.put(name, valueStr);
      }
       //切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
       boolean flag = false;
       try {
//           进行验签 true:验签通过;false:验签不通过
           flag = AlipaySignature.rsaCheckV1(params, AliPayTool.PUBLIC_KEY, AliPayTool.CHARSET, AliPayTool.SIGNTYPE);
?
           if (flag) {
               try {
                   System.out.println("验签通过========================");
                   //商户订单号
                   String outTradeNo = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
                   System.out.println("===========商户订单号=============:" + outTradeNo);
                   //支付宝交易号
                   String tradeNo = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
                   System.out.println("===========支付宝交易号=============:" + tradeNo);
                   //付款金额
                   String totalAmount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8");
                   System.out.println("===========付款金额=============:" + totalAmount);
                   //交易状态
                   String tradeStatus = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
                   System.out.println("===========交易状态=============:" + tradeStatus);
                   //判断是否支付成功
                   if ("TRADE_SUCCESS".equals(tradeStatus)) {
                       //接下来对业务进行数据处理
                       return AjaxResult.success("支付成功");
                  } else if ("TRADE_CLOSED".equals(tradeStatus)) { // 未付款交易超时关闭,或支付完成后全额退款,执行相关业务逻辑
?
                  }
              } catch (UnsupportedEncodingException e) {
//                   校验异常处理
                   // TODO Auto-generated catch block
                   e.printStackTrace();
              }
               return AjaxResult.success("支付失败");
          } else {
//               支付失败
               String outTradeNo = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
?
               return AjaxResult.error("支付失败");
          }
?
      } catch (
               AlipayApiException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
      }
       return AjaxResult.success();
  }
}
  • AliPayController

package com.ruoyi.web.controller.api;
?
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.web.controller.pay.AliPayTool;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
?
@Controller
@RequestMapping("/api/aliPay")
@Api(tags = "支付宝支付接口")
public class AliPayController{
?
   @Autowired
   private AliPayTool aliPayTool;
?
   @PostMapping(value = "/appPayOrder")
   @ResponseBody
   @ApiOperation("支付宝支付")
   @Transactional(rollbackFor = Exception.class)
   public AjaxResult appOrderPay(
           @RequestParam("ordnum") String ordnum
  ) {
       aliPayTool = new AliPayTool();
//       Order order = orderService.selectOrderById(ordnum);
//       Double totalAmount = order.getPrice();
       String orderNo = ordnum;
       Double totalAmount = 1.5;
?
       AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
//       商品描述
       model.setBody("帮得订单支付");
//       关键字
       model.setSubject("帮得订单支付");
//       订单号
       model.setOutTradeNo(orderNo);
//       最晚付款时间
       model.setTimeoutExpress("30m");
//       商品价格
       model.setTotalAmount(String.valueOf(totalAmount));
//       产品销售码
       model.setProductCode("QUICK_MSECURITY_PAY");
//       返回的信息
       String orderInfo = aliPayTool.appPay(model);
       if ("支付生成失败".equals(orderInfo)){
           return AjaxResult.error("支付生成失败");
      }
       return AjaxResult.success("操作成功",orderInfo);
  }
}

微信支付

  • 依赖

wxPay:
 # appid
appid: wxe9740c2c66583a52
 # 商户号
mchId: 1601358475
 # 秘钥
partnerKey: 0620A0ACA61A4665C88F767D6756483D
# notifyUrl: http://jkb.bajiaostar.xyz/anno/payNotify
notifyUrl: http://127.0.0.1:8099/ano/wxPayNotice #微信支付回调地址
  • 配置

package com.ruoyi.web.controller.config;
?
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
?
@Data
public class WxPayProperties {
   /**
    * appid.
    */
   @Value("${wxPay.appid}")
   private String appid;
?
   /**
    * 微信支付商户号.
    */
   @Value("${wxPay.mchId}")
   private String mchId;
?
   /**
    * 微信支付商户密钥.
    */
   @Value("${wxPay.partnerKey}")
   private String partnerKey;
?
   /**
    * 异步回调地址
    */
   @Value("${wxPay.notifyUrl}")
   private String notifyUrl;
}
?
package com.ruoyi.web.controller.config;
?
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
?
@Configuration
public class WxConfig {
   @Bean("WxPayProperties")
   public WxPayProperties wxPayProperties(){
       return new WxPayProperties();
  }
}
?
  • 回调

package com.ruoyi.web.controller.pay;
?
       import com.alipay.api.AlipayApiException;
       import com.alipay.api.internal.util.AlipaySignature;
       import com.ijpay.core.kit.WxPayKit;
       import com.ruoyi.common.core.domain.AjaxResult;
       import com.ruoyi.common.cyz.pay.WxPayUtil;
       import io.swagger.annotations.Api;
       import lombok.extern.slf4j.Slf4j;
       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.servlet.http.HttpServletRequest;
       import java.io.UnsupportedEncodingException;
       import java.math.BigDecimal;
       import java.text.SimpleDateFormat;
       import java.util.HashMap;
       import java.util.Iterator;
       import java.util.Map;
       import java.text.ParseException;
?
@Slf4j
@RequestMapping("/ano")
@RestController
@Api(tags = "支付回调接口")
public class PayNotifyController {
?
   @PostMapping("/wxPayNotice")
   public AjaxResult wxPayNotice(@RequestBody String xmlData) throws ParseException {
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       log.info("微信回调开始了==================");
       //这里我只进行了部分回调信息的保存,更多参数请查看微信支付官方api:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7&index=8
       Map<String, String> resultMap = WxPayKit.xmlToMap(xmlData);
       log.info("resultMap:" + resultMap);
       /*----------------------分割线,下面的是业务代码,根据自己业务进行修改--------------------------*/
       //订单成功业务处理
       if ("SUCCESS".equals(resultMap.get("result_code"))) {
//           // 根据resultMap处理订单业务
//           TblAutoOrderDat tblAutoOrderDat = new TblAutoOrderDat();
//           //订单描述,比如:会员卡充值,商品信息
//           tblAutoOrderDat.setAttach(resultMap.get("attach"));
//           //交易类型 比如:JSAPI、NATIVE、APP
//           tblAutoOrderDat.setTradeType(resultMap.get("trade_type"));
//           //商户订单号 商家生成,传给微信返回的
//           tblAutoOrderDat.setOrderId(resultMap.get("out_trade_no"));
//           //订单金额 订单总金额,单位为分,我这里转换成元了
//           tblAutoOrderDat.setTotalFee(new BigDecimal(resultMap.get("total_fee")).divide(new BigDecimal(100)));
//           //微信支付订单号
//           tblAutoOrderDat.setTransactionId(resultMap.get("transaction_id"));
//           //支付完成时间
//           String newDate = resultMap.get("time_end");
//           tblAutoOrderDat.setPayTime(sdf.parse(newDate.substring(0, 4) + "-" + newDate.substring(4, 6) + "-" + newDate.substring(6, 8) + " " + newDate.substring(8, 10) + ":" + newDate.substring(10, 12) + ":" + newDate.substring(12, 14)));
////           业务实现,把订单信息保存到数据库
//           tblAutoOrderDatService.add(tblAutoOrderDat);
      }else{
           log.info("支付失败==================");
?
?
           return AjaxResult.error("支付失败");
      }
       /*----------------------分割线,业务结束--------------------------*/
       return AjaxResult.success("支付成功");
  }
}
?
  • WxPayController

package com.ruoyi.web.controller.api;
?
import com.alibaba.fastjson.JSON;
import com.ijpay.core.enums.SignType;
import com.ijpay.core.enums.TradeType;
import com.ijpay.core.kit.IpKit;
import com.ijpay.core.kit.WxPayKit;
import com.ijpay.wxpay.WxPayApi;
import com.ijpay.wxpay.model.OrderQueryModel;
import com.ijpay.wxpay.model.UnifiedOrderModel;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.web.controller.config.WxPayProperties;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
?
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.Map;
?
@Slf4j
@RestController
@RequestMapping("/api/wxPay")
@Api(tags = "微信支付接口")
public class WxPayController {
   @Autowired
   private WxPayProperties wxPayProperties;
?
   @GetMapping(value = "/appPay")
   public AjaxResult appPay(HttpServletRequest request, @RequestParam("orderNo") String orderNo) {
//       查询订单 orderNo
       BigDecimal totalFee = new BigDecimal(1.5);
       String attach = "商品支付";
       String ip = IpKit.getRealIp(request);
       if (StringUtils.isEmpty(ip)) {
           ip = "127.0.0.1";
      }
       Map<String, String> params = UnifiedOrderModel
              .builder()
              .appid(wxPayProperties.getAppid())
              .mch_id(wxPayProperties.getMchId())
              .nonce_str(WxPayKit.generateStr())
              .body(attach)
              .attach(attach)
              .out_trade_no(WxPayKit.generateStr())
              .total_fee(String.valueOf(totalFee.multiply(new BigDecimal(100)).intValue()))
              .spbill_create_ip(ip)
              .notify_url(wxPayProperties.getNotifyUrl())
              .trade_type(TradeType.APP.getTradeType())
              .build()
              .createSign(wxPayProperties.getPartnerKey(), SignType.MD5);
?
       String xmlResult = WxPayApi.pushOrder(false, params);
?
       log.info(xmlResult);
       Map<String, String> result = WxPayKit.xmlToMap(xmlResult);
?
       String returnCode = result.get("return_code");
       String returnMsg = result.get("return_msg");
       if (!WxPayKit.codeIsOk(returnCode)) {
           log.info("错误信息:"+returnMsg);
?
      }
       String resultCode = result.get("result_code");
       if (!WxPayKit.codeIsOk(resultCode)) {
           log.info("错误信息:"+returnMsg);
      }
       // 以下字段在 return_code 和 result_code 都为 SUCCESS 的时候有返回
       String prepayId = result.get("prepay_id");
?
       Map<String, String> packageParams = WxPayKit.appPrepayIdCreateSign(wxPayProperties.getAppid(), wxPayProperties.getMchId(), prepayId,
               wxPayProperties.getPartnerKey(), SignType.MD5);
?
       String jsonStr = JSON.toJSONString(packageParams);
       log.info("返回apk的参数:" + jsonStr);
       return AjaxResult.success(packageParams);
  }
?
   /**
    * 根据微信订单号查询订单状态
    *
    * @param transactionId 微信订单号
    * @return SUCCESS/FAIL
    */
   @GetMapping("/getOrderStates/{transactionId}")
   public AjaxResult getOrderStates(@PathVariable("transactionId") String transactionId) {
       Map<String, String> params = OrderQueryModel
              .builder()
              .appid(wxPayProperties.getAppid())
              .mch_id(wxPayProperties.getMchId())
              .transaction_id(transactionId)
              .nonce_str(WxPayKit.generateStr())
              .build()
              .createSign(wxPayProperties.getPartnerKey(), SignType.MD5);
       String xml = WxPayApi.orderQuery(false, params);
       Map<String, String> resultMap = WxPayKit.xmlToMap(xml);
       log.info("resultMap:" + resultMap);
       if ("SUCCESS".equals(resultMap.get("result_code"))){
           return AjaxResult.success();
      }else{
           return AjaxResult.error();
      }
  }
}

JAVA支付对接

原文:https://www.cnblogs.com/liang-chen-fly/p/14491014.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!