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

yizhihongxing

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();
}

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

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

相关文章

  • android使用SoundPool播放音效的方法

    Sure! Here is a detailed guide on how to use SoundPool to play sound effects in Android: Import the necessary classes: import android.media.AudioAttributes; import android.media.Au…

    other 2023年8月6日
    00
  • 使用goodfeaturestotrack进行关键点检测—29

    使用goodfeaturestotrack进行关键点检测—29 引言 图像处理中的关键点检测是一个重要的研究领域,能够帮助我们在图像中发现有意义的区域并提取出这些区域的特征。其中,goodfeaturestotrack(GFT)算法是一种常用的关键点检测算法,本文将介绍如何使用GFT算法进行关键点检测。 GFT算法原理 GFT算法是一种基于角点检测的关键…

    其他 2023年3月29日
    00
  • vue cli4.0项目引入typescript的方法

    第一步:安装Vue CLI 和 Typescript 首先,你需要安装 Vue CLI 和 Typescript。运行如下命令: npm install -g @vue/cli npm install -g typescript 第二步:创建 Typescript 项目 使用 Vue CLI 创建一个新的项目,并选择手动配置,勾选需要的特性。运行如下命令: …

    other 2023年6月27日
    00
  • Android客户端post请求服务器端实例

    下面是关于Android客户端post请求服务器端实例的攻略。 前言 在移动开发中,我们经常需要和服务器进行数据交互。而在实际开发中,最常用的方式就是通过HTTP协议来进行请求响应。其中POST请求可以用于向服务端提交数据,比如注册、登录等操作。本文将介绍如何在Android客户端通过POST方式向服务端发送数据,并获取服务端返回的结果。 Android客户…

    other 2023年6月27日
    00
  • sublimetext3

    以下是Sublime Text 3的完整攻略,包括两个示例说明。 步骤 以下是Sublime Text 3的基本步骤: 下载Sublime Text 。 从Sublime官网下载Sublime Text 3的安装包。 安装Sublime Text 3。 双击下载的安装包,按照安装向导安装。 安装Package Control。 在Sublime Text 3…

    other 2023年5月6日
    00
  • centos7部署ssserver

    CentOS 7 部署 ssserver 完整攻略 ssserver 是一个基于 Python 的 Shadowsocks 服务器,用于加密和代理网络流量。在本攻略,我们将详细介绍如何在 CentOS 7 上部署 ssserver。 步骤1:安装 Python 和 pip 在部署 server 之前,需要先安装 Python 和 pip。以下是一个示例命令:…

    other 2023年5月6日
    00
  • C++位操作的常见用法小结

    C++位操作的常见用法小结 在C++中,位操作是广泛使用的技巧之一,可以帮助我们对二进制数进行高效的操作。本文将会针对C++中常见的位操作技巧进行一个小结,以供大家参考。 常用的位操作符 在C++中,常用的位操作符有以下几种: & 位与 | 位或 ^ 异或 ~ 反码 << 左移 右移 常见位操作技巧 获取二进制中某一位的值 要获取二进制中…

    other 2023年6月27日
    00
  • C++实现优先队列的示例详解

    C++实现优先队列的攻略 什么是优先队列? 优先队列是一种特殊的队列,可以根据元素的优先级进行排序和取出元素。即出队时,出队的元素是队列中所有元素中优先级最高的元素。优先队列常常用于任务调度、数据压缩、图像处理等领域。 C++中优先队列的实现 为了方便使用优先队列,C++提供了<queue>库,其内置了优先队列的数据结构,可以直接使用。这个库的底…

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