一、支付宝当面付功能Demo

官方文档https://docs.open.alipay.com/194/106078/

ps:因为沙箱环境一经配置了证书公钥则无法重置

第一步下载项目SKD&Demo

点击下载

解压后笔者使用的是eclipse,直接导入

一个TradePayDemo项目,一个是alipay-trade-sdk-20161215.jar的源码项目- TradePaySDK项目

笔者直接删掉了alipay-trade-sdk-20161215.jar依赖,使用项目依赖TradePayDemo添加,TradePaySDK项目

这样就可以直接点击查看源码方法实现的内容,主要实现运行Demo项目里面的main方法,跑得起来不报错就OK了

二、修改配置

找到zfbinfo.properties文件配置

话不多说直接看注释跟下载的对比区别增加了,证书路径配置

怎么搞证书看这里 证书密钥

# 支付宝网关名、partnerId和appId
open_api_domain = https://openapi.alipaydev.com/gateway.do
mcloud_api_domain = http://mcloudmonitor.com/gateway.do
pid = #沙箱环境的话有个UID就是了
appid = #你的APPID # RSA私钥、公钥和支付宝公钥
private_key = MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCiZjPiY1TzonKkgmTDPjiexKvcwgGw0jx7W3+C83BzOaa+ZsPc7rf+hl/93cJTTtUk8mDyPKbxWgJBZ+OBW4eaS2pgl6m1aMTi8/T/+En0kM0MHKnAPhimBFROJ8fUkXMb4PTCZAfcOmGF1i+xnfHpgy+7D96Maw+eWXrO7wL5+U5cB/8ZoeBl9Y+QhKOqNuVh7QHxrbim1X/PTeBrblFcqjDFCOzpRczWVPGqd0khctOF75uFkzEqzF7Mp6ACQckJQlRIFiiv/Ox9N6sc/zfDoXJkxp8UXw0qO9Z7by+dEev7ECSW4NKU39kh2AhNVkDZXZJM8rdQpWwT5crxn/0ZAgMBAAECggEAMQ3WFkgS3RTwtCh+70rYJ30YvLINeK/IfSqCNbf6+5MqftDj0NR613MXg8N8c1WYpHRiPEl90+FwVPlgiy5uo3isRUkKhjWDY1p1YuxIyosCpOnzjJI1N9CO9pyli9vzfTRSOnWkui0YUCkGdwxSikqKHGMKwjeEnDxDEEa6C295ytrbq89nEDYmnC5nRXTDAlnCWMhRio28KQwNsO/tcaJTOSgqnrWBUAWB9f1FZZJy39XQNIAqCh+1odxkWp66t34Pg3mxKW1sh1b0/mzx6uxWYAaxsNubJjaMJ/RaiaP4o2ULMEM1PPNgdqZWyNJt2+PzsAkWil79BtibItuhQQKBgQDztvvu3B8q7cGqcSFoKrh4ePc96/YI516Z1lgprzEQNFaUvtauC9XNvHoWL5LGvp8b7H7gwmI1XrNUWUjAx0kmbzWh/qBK+yQ7ebV8vW5EG8JYJHvFvhsWm2gY9eOnYiZXZ7Yug9Z8tXGwP3bkh2KfTxT1NrwDIz4CLiYHqvHLdQKBgQCqleHsqzyh6+bWCiqLx/a85HMk+o/GQ5YOE8CAnYs6nqFyzdIwtMcoQaYRzPFLQmVTHWN8m5AuaLTY+o93ofkIHUXDzYFkn5rMyBSDp36IRVpaSQVAzEqITYZge6iSItWeTv9aTjzNXI0tkLeO3DsIPcFMs8QYBMcrVcUd6OoKlQKBgQCPBcd7OXqg+r44hAOS2d8/891EXYEZYI5HwV4juEgWtmBJEmVx5kgmYIFVG74LHDrLbFJZHDn+EAE1cuAbIdhv0burwX3YAuIUdSxoc9KN7axzhZWNSi8jaTgBzes3g4X0rUxgp8XrkZ+SSuw+2KSr0QD/lotnW/s71FFFFrCnMQKBgHApOrJVaPmCVXX4mz7rTNWoU/lFclFHURuSayll7QyvDrKgmAqEYsqaV6oumZ0FXAAJO8fLtUJ+gCKGpNxhOI/YR23V6rURqEPrbmmeMLlC+ISSrIyNhpgWeTtpM05a7yA3CvkCpkHVD9Kc68RYE8x4Zmebb1znj1lz/LaM1Y39AoGAdn/4eQK9rd0Z3TnICIyOupAwq52WGrNJReKsxWjPaLVwzGeULdetw4gqX4rgpHO+l0skO62cxPcF2yLk5EJEeTthq7lv+oZtIdsWpZsQqLtLDeblNhPqHPgXJYXjAyT4q4ae6s9DwXPwGw3VPouE2fHM/6fVwaQV/SwL8jGnVHE= public_key = MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAomYz4mNU86JypIJkwz44nsSr3MIBsNI8e1t/gvNwczmmvmbD3O63/oZf/d3CU07VJPJg8jym8VoCQWfjgVuHmktqYJeptWjE4vP0//hJ9JDNDBypwD4YpgRUTifH1JFzG+D0wmQH3DphhdYvsZ3x6YMvuw/ejGsPnll6zu8C+flOXAf/GaHgZfWPkISjqjblYe0B8a24ptV/z03ga25RXKowxQjs6UXM1lTxqndJIXLThe+bhZMxKsxezKegAkHJCUJUSBYor/zsfTerHP83w6FyZMafFF8NKjvWe28vnRHr+xAkluDSlN/ZIdgITVZA2V2STPK3UKVsE+XK8Z/9GQIDAQAB #SHA1withRsa对应支付宝公钥
alipay_public_key = MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDIgHnOn7LLILlKETd6BFRJ0GqgS2Y3mn1wMQmyh9zEyWlz5p1zrahRahbXAfCfSqshSNfqOmAQzSHRVjCqjsAw1jyqrXaPdKBmr90DIpIxmIyKXv4GGAkPyJ/6FTFY99uhpiq0qadD/uSzQsefWo0aTvP/65zi3eof7TcZ32oWpwIDAQAB #SHA256withRsa对应支付宝公钥
#alipay_public_key = #设置应用公钥证书路径
app_cert_path = E:\\stephen\\macauo2o\\myAlipay\\appCertPublicKey_2016101400687752.crt
#设置支付宝公钥证书路径
alipay_cert_path = E:\\stephen\\macauo2o\\myAlipay\\alipayCertPublicKey_RSA2.crt
#设置支付宝根证书路径
alipay_root_cert_path = E:\\stephen\\macauo2o\\myAlipay\\alipayRootCert.crt # 签名类型: RSA->SHA1withRsa,RSA2->SHA256withRsa
sign_type = RSA2
# 当面付最大查询次数和查询间隔(毫秒)
max_query_retry = 5
query_duration = 5000 # 当面付最大撤销次数和撤销间隔(毫秒)
max_cancel_retry = 3
cancel_duration = 2000 # 交易保障线程第一次调度延迟和调度间隔(秒)
heartbeat_delay = 5
heartbeat_duration = 900

然后改TradePaySKD项目

里面的初始化方法增加证书字段配置

代码块

package com.alipay.demo.trade.config;

import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; /**
* Created by liuyangkly on 15/6/27.
*/
public class Configs {
private static Log log = LogFactory.getLog(Configs.class);
private static Configuration configs; private static String openApiDomain; // 支付宝openapi域名
private static String mcloudApiDomain; // 支付宝mcloudmonitor域名
private static String pid; // 商户partner id
private static String appid; // 商户应用id private static String privateKey; // RSA私钥,用于对商户请求报文加签
private static String publicKey; // RSA公钥,仅用于验证开发者网关
private static String alipayPublicKey; // 支付宝RSA公钥,用于验签支付宝应答 private static String appCertPath; //设置应用公钥证书路径
private static String alipayCertPath; //设置支付宝公钥证书路径
private static String alipayRootCertPath;//设置支付宝根证书路径 private static String signType; // 签名类型 private static int maxQueryRetry; // 最大查询次数
private static long queryDuration; // 查询间隔(毫秒) private static int maxCancelRetry; // 最大撤销次数
private static long cancelDuration; // 撤销间隔(毫秒) private static long heartbeatDelay ; // 交易保障线程第一次调度延迟(秒)
private static long heartbeatDuration ; // 交易保障线程调度间隔(秒) private Configs() {
// No Constructor
} // 根据文件名读取配置文件,文件后缀名必须为.properties
public synchronized static void init(String filePath) {
if (configs != null) {
return;
} try {
configs = new PropertiesConfiguration(filePath);
} catch (ConfigurationException e) {
e.printStackTrace();
} if (configs == null) {
throw new IllegalStateException("can`t find file by path:" + filePath);
} openApiDomain = configs.getString("open_api_domain");
mcloudApiDomain = configs.getString("mcloud_api_domain"); pid = configs.getString("pid");
appid = configs.getString("appid"); // RSA
privateKey = configs.getString("private_key");
publicKey = configs.getString("public_key");
alipayPublicKey = configs.getString("alipay_public_key");
signType = configs.getString("sign_type"); // certificate
appCertPath = configs.getString("app_cert_path");
alipayCertPath = configs.getString("alipay_cert_path");
alipayRootCertPath = configs.getString("alipay_root_cert_path"); // 查询参数
maxQueryRetry = configs.getInt("max_query_retry");
queryDuration = configs.getLong("query_duration");
maxCancelRetry = configs.getInt("max_cancel_retry");
cancelDuration = configs.getLong("cancel_duration"); // 交易保障调度线程
heartbeatDelay = configs.getLong("heartbeat_delay");
heartbeatDuration = configs.getLong("heartbeat_duration"); log.info("配置文件名: " + filePath);
log.info(description());
} public static String description() {
StringBuilder sb = new StringBuilder("Configs{");
sb.append("支付宝openapi网关: ").append(openApiDomain).append("\n");
if (StringUtils.isNotEmpty(mcloudApiDomain)) {
sb.append(", 支付宝mcloudapi网关域名: ").append(mcloudApiDomain).append("\n");
} if (StringUtils.isNotEmpty(pid)) {
sb.append(", pid: ").append(pid).append("\n");
}
sb.append(", appid: ").append(appid).append("\n"); sb.append(", 商户RSA私钥: ").append(getKeyDescription(privateKey)).append("\n");
sb.append(", 商户RSA公钥: ").append(getKeyDescription(publicKey)).append("\n");
sb.append(", 支付宝RSA公钥: ").append(getKeyDescription(alipayPublicKey)).append("\n"); sb.append(", 应用公钥证书路径: ").append(getKeyDescription(appCertPath)).append("\n");
sb.append(", 设置支付宝公钥证书路径: ").append(getKeyDescription(alipayCertPath)).append("\n");
sb.append(", 设置支付宝根证书路径: ").append(getKeyDescription(alipayRootCertPath)).append("\n"); sb.append(", 签名类型: ").append(signType).append("\n"); sb.append(", 查询重试次数: ").append(maxQueryRetry).append("\n");
sb.append(", 查询间隔(毫秒): ").append(queryDuration).append("\n");
sb.append(", 撤销尝试次数: ").append(maxCancelRetry).append("\n");
sb.append(", 撤销重试间隔(毫秒): ").append(cancelDuration).append("\n"); sb.append(", 交易保障调度延迟(秒): ").append(heartbeatDelay).append("\n");
sb.append(", 交易保障调度间隔(秒): ").append(heartbeatDuration).append("\n");
sb.append("}");
return sb.toString();
} private static String getKeyDescription(String key) {
int showLength = 6;
if (StringUtils.isNotEmpty(key) &&
key.length() > showLength) {
return new StringBuilder(key.substring(0, showLength))
.append("******")
.append(key.substring(key.length() - showLength))
.toString();
}
return null;
} public static Configuration getConfigs() {
return configs;
} public static String getOpenApiDomain() {
return openApiDomain;
} public static String getMcloudApiDomain() {
return mcloudApiDomain;
} public static void setMcloudApiDomain(String mcloudApiDomain) {
Configs.mcloudApiDomain = mcloudApiDomain;
} public static String getPid() {
return pid;
} public static String getAppid() {
return appid;
} public static String getPrivateKey() {
return privateKey;
} public static String getPublicKey() {
return publicKey;
} public static String getAlipayPublicKey() {
return alipayPublicKey;
} public static String getSignType() {
return signType;
} public static int getMaxQueryRetry() {
return maxQueryRetry;
} public static long getQueryDuration() {
return queryDuration;
} public static int getMaxCancelRetry() {
return maxCancelRetry;
} public static long getCancelDuration() {
return cancelDuration;
} public static void setConfigs(Configuration configs) {
Configs.configs = configs;
} public static void setOpenApiDomain(String openApiDomain) {
Configs.openApiDomain = openApiDomain;
} public static void setPid(String pid) {
Configs.pid = pid;
} public static void setAppid(String appid) {
Configs.appid = appid;
} public static void setPrivateKey(String privateKey) {
Configs.privateKey = privateKey;
} public static void setPublicKey(String publicKey) {
Configs.publicKey = publicKey;
} public static void setAlipayPublicKey(String alipayPublicKey) {
Configs.alipayPublicKey = alipayPublicKey;
} public static void setSignType(String signType) {
Configs.signType = signType;
} public static void setMaxQueryRetry(int maxQueryRetry) {
Configs.maxQueryRetry = maxQueryRetry;
} public static void setQueryDuration(long queryDuration) {
Configs.queryDuration = queryDuration;
} public static void setMaxCancelRetry(int maxCancelRetry) {
Configs.maxCancelRetry = maxCancelRetry;
} public static void setCancelDuration(long cancelDuration) {
Configs.cancelDuration = cancelDuration;
} public static long getHeartbeatDelay() {
return heartbeatDelay;
} public static void setHeartbeatDelay(long heartbeatDelay) {
Configs.heartbeatDelay = heartbeatDelay;
} public static long getHeartbeatDuration() {
return heartbeatDuration;
} public static void setHeartbeatDuration(long heartbeatDuration) {
Configs.heartbeatDuration = heartbeatDuration;
} public static String getAppCertPath() {
return appCertPath;
} public static void setAppCertPath(String appCertPath) {
Configs.appCertPath = appCertPath;
} public static String getAlipayCertPath() {
return alipayCertPath;
} public static void setAlipayCertPath(String alipayCertPath) {
Configs.alipayCertPath = alipayCertPath;
} public static String getAlipayRootCertPath() {
return alipayRootCertPath;
} public static void setAlipayRootCertPath(String alipayRootCertPath) {
Configs.alipayRootCertPath = alipayRootCertPath;
} }

注意部分:

需要增加依赖包

低版本的删掉,此处为TradePaySDK项目依赖

重点使用证书时调用的响应方法不同

 原调用的是execute需更改certificateExecute

运行测试

生成到本地二维码

沙箱付款

百度网盘有修改后的Demo

Java Web接入支付宝扫码付款API(使用SDK证书配置properties )的更多相关文章

  1. PC电脑端支付宝扫码付款出现编码错误提示原因

    给这家公司做各大场景的支付 涉及到微信内置H5支付 其他浏览器唤醒微信客户端支付 PC扫码支付 和支付宝相应的支付,但今天进行PC扫码支付时遇到一些编码问题,流程能走通. 调试错误,请回到请求来源地, ...

  2. PC、h5项目接入第三方支付宝扫码登录、扫码付款

    首先介绍一下pc项目接入支付宝扫码支付. 1.pc.移动接入支付宝扫码支付. 其实这个逻辑很简单,前端所需要处理的不是很多,后台会给一个连接,前端只需要将要支付的订单id拼接在这个连接上,然后打开跳转 ...

  3. ASP.NET Core Web 支付功能接入 微信-扫码支付篇

    这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入微信-扫码支付及异步通知功能. 开发环境:Win 10 x64.VS2017 15.6.4..NET Core SDK ...

  4. 【转载】ASP.NET Core Web 支付功能接入 微信-扫码支付篇

    转自:http://www.cnblogs.com/essenroc/p/8630730.html 这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入微信-扫码支付及异步 ...

  5. ASP.NET Core Web 支付功能接入 微信-扫码支付篇(转)

    原文 https://www.cnblogs.com/essenroc/p/8630730.html // 随着版本更迭,新版本可能无法完全适用,请参考仓库内的示例. 这篇文章将介绍ASP.NET C ...

  6. 记录:c#实现微信,支付宝扫码支付(一)

    因为公司系统业务需要,这几天了解了一下微信和支付宝扫码支付的接口,并用c#实现了微信和支付宝扫码支付的功能. 微信支付分为6种支付模式:1.付款码支付,2.native支付,3.jsapi支付,4.a ...

  7. Java之微信支付(扫码支付模式二)案例实战

    摘要:最近的一个项目中涉及到了支付业务,其中用到了微信支付和支付宝支付,在做的过程中也遇到些问题,所以现在总结梳理一下,分享给有需要的人,也为自己以后回顾留个思路. 一:微信支付接入准备工作: 首先, ...

  8. Spring使用支付宝扫码支付

    前一段一直在研究支付宝的扫码支付,不得不说,支付宝的文档写的真是一个烂(起码在下刚开始看的时候是mengbi的).文档上面的示例和demo里面的示例长的完全不一样.往往文档上面的例子很简单,而demo ...

  9. .NET Core2.0 环境下MVC模式的支付宝扫码支付接口-沙箱环境开发测试

    所有配置以及相关信息均可以从PC支付中获取 使用的生成二维码的组件名为QRCoder,该组件引用了一个第三方实现的System.Drawing类库,和支付宝官网类似 当面付SDK为Alipay.Aop ...

随机推荐

  1. python easygui用法

    一个简单的例子 在 EasyGui 中,所有的 GUI 互动均是通过简单的函数调用,下边一个简单的例子告诉你 EasyGui 确实很 Easy! import easygui as g import ...

  2. How to parse unix timestamp to time.Time

      The time.Parse function does not do Unix timestamps. Instead you can use strconv.ParseInt to parse ...

  3. 网站添加logo图片

    网站添加log图片 第一种方法 这里使用的图片一般为16*16大小的图片 <link rel="shortcut icon" href="http://xxx.xx ...

  4. 图片下载---使用gevent爬数据

    代码: import urllib.request import gevent from gevent import monkey monkey.patch_all() def downloader( ...

  5. 数位DP【模板】

    经典题型 数位 DP 问题往往都是这样的题型,给定一个闭区间 $[l, r]$,让你求这个区间中满足 某种条件 的数的总数. 强烈推荐 OI Wiki——数位DP 例题 BZOJ 1026 题目:wi ...

  6. Linux Redirecting to /bin/systemctl restart iptables.service

    方案 一 1.昨天碰到一个错误,linux下输入命令:service iptables restart时,总会报下面一个提示很简单,这句话的意思就是让你重定向到systemctl然后再启用,白话就是说 ...

  7. Jmeter之JSON Extractor

    SON Extractor的作用: 对于处理json格式的response,使用SON Extractor来提取数据是更方便的.  SON Extractor语法: 同时提取多个数据: Names o ...

  8. AirTest与模拟器连接(二)

    如果我们手边没有可用的Android真机,又想进行Android应用自动化测试,这时候就要使用AirtestIDE的Android模拟器自动化测试功能了. AirtestIDE所支持的模拟器包括 An ...

  9. webstorm中不能识别react、vue alias 路径别名符号

    https://blog.csdn.net/weixin_37939942/article/details/89388466 因为我平时比较喜欢使用ws做开发,所以在使用vue或react的时候只要使 ...

  10. vue子父组件传值

    https://blog.csdn.net/weixin_38888773/article/details/81902789 https://blog.csdn.net/jsxiaoshu/artic ...