详解APP微信支付(java后台_统一下单和回调)

详解APP微信支付(java后台_统一下单和回调)

一、前言

在移动APP中,使用微信支付功能是非常常见的需求,而且使用微信支付也是比较方便和快捷的。本文将详细介绍如何在Java后台中实现微信支付的功能。主要包括两部分:统一下单和回调。本文介绍的支付接口都是官方的API接口,并采用了最新的V3版本。

二、统一下单

下单接口是微信支付功能的核心,接口名称为:https://api.mch.weixin.qq.com/v3/pay/transactions/app 。调用下单接口需要提供一些必填参数,如下:

{
    "amount": {
        "currency": "CNY",
        "total": 1
    },
    "appid": "wx8888888888888888",
    "mchid": "1234567890",
    "description": "商品描述",
    "notify_url": "https://www.example.com",
    "out_trade_no": "1217752501201407033233368018",
    "attach": "附加数据"
}

其中,参数amount表示支付金额,appid表示应用ID,mchid表示微信商户号,notify_url表示支付结果回调通知URL。

下面是一个完整的统一下单接口的Java实现示例:

PublicKey opensslPublicKey = WxPayUtils.loadPublicKey("wechatpay_certificate.pem");
PrivateKey merchantPrivateKey = WxPayUtils.loadPrivateKey("merchant_private_key.pem");

//准备请求体
JsonObject requestBody = new JsonObject();
requestBody.addProperty("appid", WXPayConfig.APP_ID);
requestBody.addProperty("mchid", WXPayConfig.MCH_ID);
requestBody.addProperty("description", "Test Product");
requestBody.addProperty("out_trade_no", "20150806125346");
requestBody.addProperty("notify_url", "https://www.example.com");
requestBody.addProperty("amount", getAmountJson());
requestBody.addProperty("attach", "This is attachment");

//构建请求头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

//签名
headers.set("Authorization", WxPayUtils.getAuthorizationHeaderValue(requestBody.toString(), merchantPrivateKey));

//发送请求
RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory(new SimpleClientHttpRequestFactory());
ResponseEntity<String> response = restTemplate.exchange(WXPayConfig.UNIFIED_ORDER_API, HttpMethod.POST, new HttpEntity<>(requestBody.toString(), headers), String.class);

三、回调

回调是支付完成后必须要处理的事情,否则无法保证交易的安全性。回调通知分为两种类型:支付成功通知和退款成功通知。本文只介绍支付成功通知的处理。回调通知将通过notify_url参数中指定的URL地址通知到后台。下面是一个完整的回调处理的Java实现示例:

@PostMapping(value = "/pay/notify", headers = {"Content-Type=application/xml"})
@ResponseBody
public WxPayNotifyResponse notify(@RequestBody String requestBody, HttpServletRequest request) {
  //获取请求头签名
  String authorization = request.getHeader("Authorization");

  //验证签名
  if (!WxPayUtils.verifySignature(requestBody.getBytes(), authorization, WxPayUtils.loadPublicKey("wechatpay_certificate.pem"))) {
    //签名不一致,直接返回失败
    return WxPayNotifyResponse.fail("Signature verification failed");
  }

  //将XML转成Java对象
  WxPayNotifyRequest payNotify = WxPayUtils.convertXmlToObject(requestBody, WxPayNotifyRequest.class);

  //检查支付状态
  if ("SUCCESS".equals(payNotify.getResultCode())) {
    //支付成功
    //TODO:  处理业务逻辑,例如更新订单状态等
    return WxPayNotifyResponse.success();
  } else {
    //支付失败
    return WxPayNotifyResponse.fail(payNotify.getReturnMsg());
  }
}

至此,本文介绍的微信支付的统一下单和回调的Java实现就完成了。实际的开发中,还需要处理一些异常情况,例如请求失败、网络超时等,需要根据实际情况进行处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解APP微信支付(java后台_统一下单和回调) - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 基于JavaMail的Java实现简单邮件发送功能

    下面是详细攻略: JavaMail介绍 JavaMail是一种在Java平台上发送和接收电子邮件的API。JavaMail被设计用于打理所有与邮件相关的任务,包括发送、接收、查看或删除邮件等操作。JavaMail的主要功能如下: 连接邮件服务器 发送邮件 接收邮件 删除邮件 Java实现简单邮件发送功能 在Java中要使用JavaMail实现邮件发送功能,需…

    Java 2023年5月18日
    00
  • 如何使用Spring自定义Xml标签

    如何使用Spring自定义Xml标签 Spring框架允许开发者自定义标签,扩展Spring标签库,以便支持自定义的xml标签。本文将介绍如何使用Spring自定义Xml标签,并提供两例示例说明。 Spring自定义Xml标签的过程: 定义schema文件 定义一个schema文件,以xsd为后缀名,包含Element和Attribute的定义。 编写Nam…

    Java 2023年6月15日
    00
  • idea中引入了gb2312编码的文件的解决方法

    下面是关于在IDEA中引入了GB2312编码的文件的解决方法的完整攻略: 标题 首先,需要了解一些关于编码的基础知识。GB2312是一种汉字编码,它包含了常用的中文汉字,但不支持很多生僻字和繁体字。在IDEA中,我们可能需要引入一些使用了GB2312编码的文件,但是默认的编码是UTF-8,如果我们不做任何处理,那么就会出现乱码的情况。接下来就让我们看看具体的…

    Java 2023年5月20日
    00
  • 使用Bootstrap Tabs选项卡Ajax加载数据实现

    使用Bootstrap Tabs选项卡Ajax加载数据实现,是一个常见的前端技术组合。其主要流程如下: 在页面上创建Bootstrap Tabs选项卡结构,即一个ul列表和多个对应的div内容区域。 在每个内容区域中预留一个空div,用于接收Ajax加载后的数据,同时在ul列表中对应的li标签中添加数据源链接。 当用户点击对应li标签时,通过Ajax从后台获…

    Java 2023年6月15日
    00
  • Java Date(日期)对象进行格式化的思路详解

    以下是Java Date(日期)对象进行格式化的完整攻略。 格式化思路 Java中提供了SimpleDateFormat类,可以将Date对象转换成指定格式的字符串。SimpleDateFormat类中定义了一些字符,用于表示时间在输出时应该如何格式化。例如,字符yyyy表示年份,MM表示月份,dd表示日期,HH表示小时,mm表示分钟,ss表示秒钟等。这些字…

    Java 2023年5月20日
    00
  • 原生JS实现$.param() 函数的方法

    当我们使用jQuery库时,我们通常使用$.param()函数来将一个对象序列化为一个字符串形式的参数列表,以便可以在URL,Ajax请求等中使用。但是如果我们需要在没有引入jQuery的情况下使用该函数,我们可以考虑使用原生JS来实现。 下面是用原生JS实现$.param()函数的方法: 1. 将一个对象序列化为查询字符串 将一个对象序列化为查询字符串的方…

    Java 2023年6月15日
    00
  • 详解Java的类加载机制及热部署的原理

    讲解“详解Java的类加载机制及热部署的原理”需要从以下三个方面入手: 类加载的过程、类的加载机制和Java的热部署原理。 一、类加载过程 Java的类加载过程分为以下三个部分: 加载:查找并加载类的二进制数据; 链接:将类的二进制数据合并到JVM中; 初始化:对类进行初始化。 其中加载和链接是“类加载”的前两个阶段,初始化是“类加载”结果的最后一个阶段。 …

    Java 2023年5月26日
    00
  • Spring Boot2.0使用Spring Security的示例代码

    Spring Boot2.0使用Spring Security的示例代码 Spring Security是一个功能强大的安全框架,可以帮助我们实现身份验证、授权、攻击防护等功能。在Spring Boot2.0中,我们可以很方便地集成Spring Security,并实现基本的安全控制。本文将详细讲解Spring Boot2.0使用Spring Securit…

    Java 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部