java服务端微信APP支付接口详解

Java服务端微信APP支付接口详解

微信APP支付是在APP中使用微信支付的一种方式。它通常使用在Android或iOS移动设备上。

在本篇攻略中,我们将会讲解如何使用Java来构建微信APP支付的服务端接口。

前置条件

在开始构建微信APP支付接口之前,我们需要确保以下条件已经满足:

  • 你已经在微信商户平台上开通了支付功能,并且获得了商户号、支付密钥等相关信息。
  • 你已经熟悉了微信支付的基本概念和API接口。

准备工作

在开始构建服务端接口之前,我们需要完成一些准备工作,包括:

  • 添加微信支付SDK到项目中
  • 配置项目相关信息
  • 构建支付请求

添加微信支付SDK到项目中

我们可以通过以下方式将微信支付SDK添加到项目中:

<dependency>
   <groupId>com.github.wxpay</groupId>
   <artifactId>wxpay-sdk</artifactId>
   <version>3.0.9</version>
</dependency>

配置项目相关信息

我们需要配置一些项目相关的信息,包括商户号、APPID、支付密钥等。可以通过以下方式实现:

WXPayConfig config = new WXPayConfig();
config.setAppID("wxAPPID");
config.setMchID("wxMCHID");
config.setKey("wxPAYKEY");
config.setNotifyURL("http://www.example.com/wxpay/notify");

构建支付请求

在请求支付之前,我们需要先构建请求对象,包含订单号、金额、客户端IP等信息。可以通过以下方式实现:

WXPay wxpay = new WXPay(config);
Map<String, String> data = new HashMap<String, String>();
data.put("body", "腾讯充值中心-QQ会员充值");
data.put("out_trade_no", "2016090910595900000012");
data.put("device_info", "");
data.put("fee_type", "CNY");
data.put("total_fee", "1");
data.put("spbill_create_ip", "123.12.12.123");
data.put("time_start", "20160909105959");
data.put("time_expire", "20160909111959");
data.put("notify_url", "http://www.example.com/wxpay/notify");
data.put("trade_type", "APP");  
Map<String, String> resp = wxpay.unifiedOrder(data);
System.out.println(resp);

支付流程

当我们构建好支付请求之后,接下来将会执行一系列的流程来完成支付。下面是详细的支付流程。

1.生成签名

在完成支付请求之后,我们首先需要对请求参数进行签名,用于在接下来的支付过程中进行校验。可以通过以下方式实现:

data.put("sign", WXPayUtil.generateSignature(data, "wxPAYKEY"));

2.发送支付请求

在完成签名之后,我们将会将支付请求以XML的格式发送到微信支付服务器,并获得服务器的响应。可以通过以下方式实现:

Map<String, String> resp = wxpay.unifiedOrder(data);

3.解析支付结果

接收到微信支付服务器的响应之后,我们需要对响应结果进行解析,以获取支付结果。可以通过以下方式实现:

boolean result = wxpay.isPayResultNotifySignatureValid(resp);
if(result){
   //验证成功
}else{
   //验证失败
}

4.生成APP支付参数

在获取到支付结果之后,我们需要根据结果构建APP支付参数,并传递给客户端。可以通过以下方式实现:

data.put("prepayid", resp.get("prepay_id"));
data.put("partnerid", config.getMchID());
data.put("timestamp", Long.toString(System.currentTimeMillis() / 1000));
data.put("noncestr", WXPayUtil.generateNonceStr());
data.put("package", "Sign=WXPay");
data.put("sign", WXPayUtil.generateSignature(data, config.getKey()));

5.调用APP支付

在构建完APP支付参数后,我们将会在客户端调用APP支付。可以通过以下方式实现:

PayReq req = new PayReq();
req.appId = data.get("appid");
req.partnerId = data.get("partnerid");
req.prepayId = data.get("prepayid");
req.packageValue = data.get("package");
req.nonceStr = data.get("noncestr");
req.timeStamp = data.get("timestamp");
req.sign = data.get("sign");
api.sendReq(req);

示例说明

下面是两个基于Java实现的微信APP支付示例,用于演示如何使用Java构建微信APP支付服务端接口。

示例一

WXPayConfig config = new WXPayConfig();
config.setAppID("wxAPPID");
config.setMchID("wxMCHID");
config.setKey("wxPAYKEY");
config.setNotifyURL("http://www.example.com/wxpay/notify");

WXPay wxpay = new WXPay(config);
Map<String, String> data = new HashMap<String, String>();
data.put("body", "腾讯充值中心-QQ会员充值");
data.put("out_trade_no", "2016090910595900000012");
data.put("device_info", "");
data.put("fee_type", "CNY");
data.put("total_fee", "1");
data.put("spbill_create_ip", "123.12.12.123");
data.put("time_start", "20160909105959");
data.put("time_expire", "20160909111959");
data.put("notify_url", "http://www.example.com/wxpay/notify");
data.put("trade_type", "APP");  
Map<String, String> resp = wxpay.unifiedOrder(data);

boolean result = wxpay.isPayResultNotifySignatureValid(resp);
if(result){
   data.put("prepayid", resp.get("prepay_id"));
   data.put("partnerid", config.getMchID());
   data.put("timestamp", Long.toString(System.currentTimeMillis() / 1000));
   data.put("noncestr", WXPayUtil.generateNonceStr());
   data.put("package", "Sign=WXPay");
   data.put("sign", WXPayUtil.generateSignature(data, config.getKey()));

   PayReq req = new PayReq();
   req.appId = data.get("appid");
   req.partnerId = data.get("partnerid");
   req.prepayId = data.get("prepayid");
   req.packageValue = data.get("package");
   req.nonceStr = data.get("noncestr");
   req.timeStamp = data.get("timestamp");
   req.sign = data.get("sign");
   api.sendReq(req);
}

示例二

WXPayConfig config = new WXPayConfig();
config.setAppID("wxAPPID");
config.setMchID("wxMCHID");
config.setKey("wxPAYKEY");
config.setNotifyURL("http://www.example.com/wxpay/notify");

WXPay wxpay = new WXPay(config);
Map<String, String> data = new HashMap<String, String>();
data.put("body", "腾讯充值中心-QQ会员充值");
data.put("out_trade_no", "2016090910595900000012");
data.put("device_info", "");
data.put("fee_type", "CNY");
data.put("total_fee", "1");
data.put("spbill_create_ip", "123.12.12.123");
data.put("time_start", "20160909105959");
data.put("time_expire", "20160909111959");
data.put("notify_url", "http://www.example.com/wxpay/notify");
data.put("trade_type", "APP");  
Map<String, String> resp = wxpay.unifiedOrder(data);

boolean result = wxpay.isPayResultNotifySignatureValid(resp);
if(result){
   data.put("prepayid", resp.get("prepay_id"));
   data.put("partnerid", config.getMchID());
   data.put("timestamp", Long.toString(System.currentTimeMillis() / 1000));
   data.put("noncestr", WXPayUtil.generateNonceStr());
   data.put("package", "Sign=WXPay");
   data.put("sign", WXPayUtil.generateSignature(data, config.getKey()));

   JSONObject obj = new JSONObject();
   obj.put("appid", data.get("appid"));
   obj.put("partnerid", data.get("partnerid"));
   obj.put("prepayid", data.get("prepayid"));
   obj.put("noncestr", data.get("noncestr"));
   obj.put("package", data.get("package"));
   obj.put("timestamp", data.get("timestamp"));
   obj.put("sign", data.get("sign"));

   return obj.toString();
}
阅读剩余 78%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java服务端微信APP支付接口详解 - Python技术站

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

相关文章

  • web是什么意思?

    Web(全称World Wide Web)指的是万维网,是互联网的一部分,是一种基于超文本的、全球性的、公共的、互动的信息资源网络。Web是一种客户端/服务器模型的应用,通过HTTP协议从Web服务器获取HTML(超文本标记语言)文件,然后在客户端浏览器中解释并显示出来。 Web的起源可以追溯到1989年,由英国计算机科学家蒂姆·伯纳斯-李(Tim Bern…

    其他 2023年4月16日
    00
  • kafka常用命令合集

    以下是“kafka常用命令合集”的完整攻略: kafka常用命令合集 Kafka是一个分布式的消息队列系统,常用于大规模数据处理和实时数据流处理。本攻略将详细讲解Kafka常用命令,包括创建主题、发送消息、消费消息等内容。 创建主题 在Kafka中,主题是消息的逻辑分类,可以通过以下命令创建主题: bin/kafka-topics.sh –create -…

    other 2023年5月8日
    00
  • Unity3D之UGUI学习笔记:EventSystem

    Unity3D之UGUI学习笔记:EventSystem的完整攻略 在Unity3D中,UGUI(Unity GUI)是一种用于创建用户界面的工具集。EventSystem是UGUI中的一个重要组件,它用于处理用户输入事件。在本文中,我们将详细介绍EventSystem的作用和使用方法,并提供两个示例说明。 EventSystem的作用 EventSyste…

    other 2023年5月5日
    00
  • 详解WPF中用户控件和自定义控件的使用

    详解WPF中用户控件和自定义控件的使用 WPF中的控件可以根据我们的需要进行自定义,这就涉及到两种方式:用户控件和自定义控件。本文将详细讲解这两种方式的使用方法。 用户控件 用户控件是由多个控件组成的可重用控件。我们可以将多种原生控件组合在一起,用 C# 或 VB.NET 编写代码,从而构建出一个新的用户控件。在开发过程中,用户控件可以像其他控件那样使用、放…

    other 2023年6月25日
    00
  • Python实现的批量修改文件后缀名操作示例

    Python实现的批量修改文件后缀名操作示例攻略 在Python中,我们可以使用os模块和shutil模块来实现批量修改文件后缀名的操作。下面是一个完整的攻略,包含了两个示例说明。 示例一:将指定目录下的所有文件后缀名修改为新的后缀名 import os def batch_rename_files(directory, old_extension, new…

    other 2023年8月5日
    00
  • Android 实现夜间模式的快速简单方法实例详解

    Android 实现夜间模式的快速简单方法实例详解 在 Android 应用中实现夜间模式是一种常见的需求。本攻略将介绍一种快速简单的方法来实现夜间模式,并提供两个示例说明。 方法概述 实现夜间模式的方法是通过改变应用的主题来实现。我们将创建两个主题,一个用于日间模式,一个用于夜间模式。然后,根据用户的选择,动态地切换应用的主题。 步骤 以下是实现夜间模式的…

    other 2023年9月7日
    00
  • 使用vNode实现给列表字段打标签

    使用vNode实现给列表字段打标签可以大大提高列表可读性和易用性,以下是详细的实现攻略。 1. 准备工作 首先需要引入vNode库,可以使用npm进行安装。 npm install –save-dev vnode 或者直接在html页面中引入vNode库 <script src="https://unpkg.com/vnode@latest…

    other 2023年6月26日
    00
  • ios基础篇(二十七)——json解析

    以下是关于“iOS基础篇(二十七)——JSON解析”的完整攻略: 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式易于阅读和编,也易于机器解析和生成。JSON数据格式是一种键值对的数据结构,可以表示数字、字符串布尔值、数组和对象等数据类型。 JSON解析 在iOS中,可以使用NSJSONSeriali…

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