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

相关文章

  • springMVC解决ajax请求乱码的三种方法

    在Spring MVC中,当使用Ajax发送请求时,可能会出现中文乱码的问题。这是因为Ajax默认使用UTF-8编码,而Spring MVC默认使用ISO-8859-1编码。为了解决这个问题,我们可以采取以下三种方法: 1. 使用过滤器 我们可以使用过滤器来解决Ajax请求中文乱码的问题。在过滤器中,我们可以将请求和响应的编码都设置为UTF-8。 下面是一个…

    Java 2023年5月18日
    00
  • 简单讲解java中throws与throw的区别

    简单讲解java中throws与throw的区别 在Java中,throw和throws关键字经常用到,尤其在异常处理方面。虽然它们的名称相似,但它们却有着截然不同的作用。下面,我们将用清晰易懂的方式详细讲解这两个关键字的区别。 throw throw关键字用于抛出一个异常,用来通知调用方法的代码,指明了出现了问题,并且在遇到无法处理的异常时将它传递给调用者…

    Java 2023年5月25日
    00
  • JavaWeb项目FullCalendar日历插件使用的示例代码

    下面是详细讲解JavaWeb项目中使用FullCalendar日历插件的攻略: 简介 FullCalendar是一款基于jQuery的开源工具,可以用来构建全功能、交互式日历和调度表。它可以用于Web应用程序、企业级管理系统、个人日历、日程安排等场景。使用FullCalendar可以快速高效地构建一个功能丰富的日历。下面是如何在JavaWeb项目中使用Ful…

    Java 2023年5月23日
    00
  • native2ascii用法解析

    Native2ascii用法解析 什么是native2ascii? native2ascii是一个Java工具,用于将本地属性文件(即包含中文等非ASCII字符的属性文件)转换为不包含非ASCII字符的ASCII编码的属性文件。转换后的属性文件可以被Java应用程序载入并正确处理中文等非ASCII字符。 如何使用native2ascii? native2as…

    Java 2023年6月1日
    00
  • Java执行JavaScript代码

    下面是Java执行JavaScript代码的完整攻略,包含两条示例说明。 1. 前置知识 在执行JavaScript代码前,需要先了解几个概念: 版本:Java需要使用1.7及以上版本才能支持JavaScript 引擎:Java中通常使用Rhino或Nashorn引擎执行JavaScript代码 接口:Java提供了脚本引擎接口,用于在Java中执行Java…

    Java 2023年5月26日
    00
  • Java日常练习题,每天进步一点点(60)

    首先,这是一篇Java日常练习题的攻略,包含了60个练习题目,帮助学习Java的人每天进步一点点。本文分为如下部分: 攻略简介 练习题目列表 示例说明 攻略简介 这篇攻略共包含了60个Java练习题目,力求帮助Java学习者过好编程的每一天。每个练习题目的描述都很清晰明了,题目中包含了需要完成的任务,做完题目后会有详细的答案和代码解释。通过这些练习题目的完成…

    Java 2023年5月23日
    00
  • JavaSpringBoot报错“ProcessingException”的原因和处理方法

    原因 “ProcessingException” 错误通常是以下原因引起的: 代码逻辑问题:如果您的代码逻辑存在问题,则可能会出现此错误。在这种情况下,需要检查您的代码逻辑并确保它们正确。 网络连接问题:如果网络连接存在问题,则可能会出现此错误。在这种情况下,需要检查网络连接并确保它们正确。 服务器响应问题:如果服务器响应存在问题,则可能会出现此错误。在这种…

    Java 2023年5月4日
    00
  • SpringBoot整合Mybatis实现CRUD

    好的。下面将详细讲解“SpringBoot整合Mybatis实现CRUD”的完整攻略,包括搭建环境、配置文件、实现CRUD操作等过程。 一、搭建环境 首先,我们需要搭建好Java开发环境,包括JDK、IDE等。此外,我们还需要在pom.xml文件中添加如下依赖: <dependency> <groupId>org.springfram…

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