详解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日

相关文章

  • java反射超详细讲解

    Java反射超详细讲解 什么是Java反射 Java反射(Reflection)是指在程序运行时,可以对一个类进行解剖,获取到类的所有信息,包括类名、父类、接口、变量、方法等,并能够访问和操作对象的属性和方法。 正常情况下,我们在使用Java开发时,需要先编写好类,并通过该类生成对象,然后才能使用该对象的属性和方法。但是,当我们使用反射技术时,我们可以在不编…

    Java 2023年5月25日
    00
  • java string的一些细节剖析

    Java String的一些细节剖析 基本概念 Java中的字符串是由多个字符组成的,可以通过String类进行实现。Java字符串有一些独特的性质,值得我们深入研究。 创建字符串 Java中创建字符串的常用方式有: String str1 = "Hello"; String str2 = new String("World&q…

    Java 2023年6月1日
    00
  • java实现单机限流

    Java实现单机限流,可以通过限制每秒钟能处理多少次请求、对同一IP的请求进行限制等手段来避免服务被恶意请求压垮。下面是实现单机限流的完整攻略: 步骤一:引入限流工具包 Java实现单机限流可以使用开源限流工具包,比如Guava、Redis等。 以Guava为例,引入Guava限流工具包的步骤如下: 在pom.xml文件中添加以下依赖 <depende…

    Java 2023年5月19日
    00
  • 浅析java中的取整(/)和求余(%)

    浅析Java中的取整(/)和求余(%) 在Java中,取整运算符/和求余运算符%是常见的算术运算符。它们经常被用来处理整数类型的数据。然而,在使用这两个运算符时,很多人常常容易混淆它们的意义和区别。本文将对这两个运算符进行一些简单的分析,并通过一些示例来说明它们的具体用法。 取整运算符(/) 在Java中,取整运算符/通常被用来进行整数除法操作,它返回两个整…

    Java 2023年5月26日
    00
  • 理解java多线程中ExecutorService使用

    接下来我会为你详细讲解 “理解Java多线程中ExecutorService使用”的完整攻略。 1. ExecutorService 是什么? ExecutorService 接口是 Java 并发 API 提供的一个线程池管理器。它可以管理一个池子中的线程数量,也可以通过合理配置线程池中的参数,来提高系统的吞吐量和性能。 2. ExecutorServic…

    Java 2023年5月26日
    00
  • Tomcat配置https并访问http自动跳转至https

    下面是Tomcat配置https并访问http自动跳转至https的完整攻略,过程中包含两条示例说明。 准备工作 在进行Tomcat配置https之前,需要先准备以下工作: 申请SSL证书。可以通过CA机构购买或者免费的Let’s Encrypt证书。这里以Let’s Encrypt为例进行说明。 安装Java JDK,并配置环境变量。 安装Tomcat。这…

    Java 2023年6月15日
    00
  • logback自定义json日志输出示例详解

    对于这个话题,我会用标准的 Markdown 格式来回答,并且提供两个具体的示例说明。以下是完整攻略: logback自定义json日志输出示例详解 什么是logback? logback 是一个 Java 日志框架,与 log4j 相比具有更高的性能和更丰富的功能。 为什么需要自定义json日志输出? 在日志分析和处理上,json 格式的日志更加方便和易于…

    Java 2023年5月26日
    00
  • Java实战员工绩效管理系统的实现流程

    Java实战员工绩效管理系统的实现流程 本篇攻略主要讲解如何设计和实现一个员工绩效管理系统,以Java编程语言为基础,并且包括了以下几个方面的内容: 设计系统部件和功能模块 创建数据库结构和数据模型 开发业务功能和控制器 实现基于MVC架构的用户界面 部署系统到远程服务器 设计系统部件和功能模块 在设计系统的时候,需要考虑到员工绩效管理系统的核心功能,例如:…

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