java实现H5请求支付宝支付(spring boot)

这次给的任务是看一下支付宝的app支付这块。于是通过网上进行查找相关的资料,进行相关的开发,并记录下来。通过支付宝的官网进行查看:https://docs.open.alipay.com/203
1.引入支付宝的SDK的依赖;

  <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>3.7.89.ALL</version>
  </dependency>

2.H5(app)请求支付宝支付的必要参数:
1)appid:
在这里插入图片描述
2)支付网关
a.沙箱测试的话,支付宝网关为:

https://openapi.alipaydev.com/gateway.do

b.上线正式环境的话,支付宝的网关为:

https://openapi.alipay.com/gateway.do

3)商户私钥
3.1)windows环境下载秘钥的生成工具的地址:https://docs.open.alipay.com/291/105971/
3.2)用如下图选择方式生成秘钥:
在这里插入图片描述
3.3)通过工具生成密钥后,这里的秘钥即是商户私钥;
在这里插入图片描述
3.4)将应用私钥复制到代码中:

在这里插入图片描述
3.5)将里面的公钥复制到网页中,https://openhome.alipay.com/platform/appDaily.htm?tab=info
如下图所示:
在这里插入图片描述
3.6)接着查看支付宝公钥并复制,这里就是支付宝的公钥。
在这里插入图片描述
3.7)复制到代码中,如图所示:
在这里插入图片描述
4.代码模块,首先是配置参数的模块:

public class AliPayConfig {
    //支付宝移动端appid
    public static final String ALIPAY_APP_APPID = "";

    //支付宝商户私钥
    public static final String ALIPAY_PRIVATE_KEY = "";
    //支付宝公钥
    public static final String ALIPAY_PUBLIC_KEY = "";
    //支付宝网关
    public static final String ALIPAY_GATEWAY_URL = "https://openapi.alipay.com/gateway.do";

    // 验证方式
    public static final String SIGN_TYPE = "RSA2";

    // 返回路径
    public static final String ALIPAY_NOTIFYURL = "";

    // 传输方式
    public static final String FORMAT = "json";

    // 字符串格式
    public static final String CHARSET = "UTF-8";

    private static AlipayClient alipayClient = null;

    public static AlipayClient getAlipayClient() throws AlipayApiException {
        //实例化客户端
        if (alipayClient == null) {
            synchronized (AliPayUtil.class) {
                if (null == alipayClient) {
                    alipayClient = new DefaultAlipayClient(ALIPAY_GATEWAY_URL, ALIPAY_APP_APPID, ALIPAY_PRIVATE_KEY,
                            FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
                }
            }
        }
        return alipayClient;
    }
}

在这里插入图片描述
5.工具类,里面两个方法,一个支付,一个回掉方法。

public class H5PayUtil {

    @Value("${callback.url}")
    private String callbackUrl;

    private static ObjectMapper mapper = new ObjectMapper();

    /**
     * H5请求支付宝支付
     * @param h5PayDto
     * @return
     */
    public AlipayTradeWapPayResponse aliPayH5(H5PayDto h5PayDto) {
        try {
            AlipayClient alipayClient = AliPayConfig.getAlipayClient();
            AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
            request.setNotifyUrl("");
            request.setBizContent(getAliPayRequest(h5PayDto).toString());
            request.setReturnUrl(h5PayDto.getReturnUrl());
            AlipayTradeWapPayResponse responseStr = alipayClient.pageExecute(request);
            log.info(responseStr.getBody());
            return responseStr;
        } catch (Exception e) {
            e.printStackTrace();
        }
      return  null;
    }


    private  ObjectNode getAliPayRequest(H5PayDto  h5PayDto) throws UnsupportedEncodingException {
        ObjectNode obj = mapper.createObjectNode();
        //obj.put("subject", URLEncoder.encode(payRequest.getBody(), "GBK"));
        obj.put("subject", h5PayDto.getSubject());
        obj.put("out_trade_no", h5PayDto.getOutTradeNo());
        obj.put("timeout_express", 30d);
        //obj.put("time_expire", DateTimeUtils.getYmdhmFormatDate(System.currentTimeMillis() + DateUtils.DAY_IN_MILLS));
        obj.put("total_amount", h5PayDto.getTotalAmount());
        obj.put("quit_url", h5PayDto.getReturnUrl());
        obj.put("product_code", "QUICK_WAP_PAY");
        return obj;
    }


    /**
     * 功能描述 支付回调
     *
     * @param request
     * @return java.lang.String
     */
    public String aliPayNotify(HttpServletRequest request) {
        Map<String, String> params = Maps.newHashMap();
        try {
            //获取支付宝POST过来反馈信息
            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);
            }
            //调用SDK验证签名
            boolean flag = AlipaySignature.rsaCheckV1(params, AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.CHARSET,
                    AliPayConfig.SIGN_TYPE);
            if (flag) { // 验证成功
                return "success";
            }

        } catch (Exception e) {
            log.info("aliPayNotify exception={}", e);
            return "fail";
        }
        return "fail";
    }



}

在这里插入图片描述
6.需要的参数实体

   @ApiModelProperty(value = "商品的标题", required = true)
    @NotNull(message = "缺少请求参数")
    private String subject;

    @ApiModelProperty(value = "订单号", required = true)
    @NotNull(message = "缺少请求参数")
    private String outTradeNo;

    @ApiModelProperty(value = "金额", required = true)
    @NotNull(message = "缺少请求参数")
    private String totalAmount;

    @ApiModelProperty(value = "支付成功后回跳地址")
    private String  returnUrl;

在这里插入图片描述
7.通过接口H5请求支付宝接口

    @PostMapping("/H5Pay")
    @ApiOperation(value = "根据订单号进行支付", notes = "H5调用支付宝支付接口")
    @SneakyThrows
    public ResponseClass<String> pay(@RequestBody H5PayDto h5PayDto) {
        String result = h5PayUtil.aliPayH5(h5PayDto).getBody();
        log.info("支付宝返回的信息是:" + result);
        return ResponseClass.ok(result);
    }

在这里插入图片描述
8.支付回掉的controller

   @Autowired
    private H5PayUtil h5PayUtil;

    @RequestMapping("/H5PayNotice")
    public String orderNotify(HttpServletRequest request) {
        String alipayNotice = h5PayUtil.aliPayNotify(request);
        return alipayNotice;
    }

在这里插入图片描述
9.进行接口的请求。如图,返回了一个from表单,即可表示H5请求支付宝已成功。接下来可以和前端进行联调
在这里插入图片描述
支付的代码上传至GitHub上:
https://github.com/virtuousOne/pay

要在Java实现H5微信支付,可以使用微信官方提供的支付API,具体步骤如下: 1. 注册微信支付服务号,并开通支付功能。 2. 在Java中调用微信支付API,生成预支付订单,获取预支付订单号。 3. 根据预支付订单号生成支付链接,返回给前端。 4. 前端通过支付链接跳转至微信支付页面进行支付。 以下是Java代码示例: 1. 生成预支付订单: ```java public String createPrepayOrder(String body, String outTradeNo, int totalFee, String spbillCreateIp, String notifyUrl) throws Exception { // 构造请求参数 SortedMap<String, String> params = new TreeMap<>(); params.put("appid", "微信公众号appid"); params.put("mch_id", "商户号"); params.put("nonce_str", WXPayUtil.generateNonceStr()); params.put("body", body); params.put("out_trade_no", outTradeNo); params.put("total_fee", totalFee + ""); params.put("spbill_create_ip", spbillCreateIp); params.put("notify_url", notifyUrl); params.put("trade_type", "MWEB"); String sign = WXPayUtil.generateSignature(params, "商户密钥"); params.put("sign", sign); String xml = WXPayUtil.mapToXml(params); String url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; String result = HttpUtil.postXml(url, xml); Map<String, String> resultMap = WXPayUtil.xmlToMap(result); return resultMap.get("prepay_id"); } ``` 2. 生成支付链接: ```java public String createPayUrl(String prepayId) throws Exception { SortedMap<String, String> params = new TreeMap<>(); params.put("prepay_id", prepayId); params.put("mweb_url", "微信支付回调地址"); params.put("nonce_str", WXPayUtil.generateNonceStr()); params.put("timestamp", System.currentTimeMillis() / 1000 + ""); params.put("sign_type", "MD5"); String sign = WXPayUtil.generateSignature(params, "商户密钥"); params.put("sign", sign); String url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; String param = WXPayUtil.mapToXml(params); String result = HttpUtil.postXml(url, param); Map<String, String> resultMap = WXPayUtil.xmlToMap(result); return resultMap.get("mweb_url"); } ``` 以上是Java实现H5微信支付的基本步骤,需要注意的是,生成预支付订单和生成支付链接时,需要按照微信官方文档提供的参数规则进行构造,才能正确生成订单和支付链接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

virtuousOne

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值