Java Web接入支付宝扫码付款API(使用SDK证书配置properties )
一、支付宝当面付功能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 )的更多相关文章
- PC电脑端支付宝扫码付款出现编码错误提示原因
给这家公司做各大场景的支付 涉及到微信内置H5支付 其他浏览器唤醒微信客户端支付 PC扫码支付 和支付宝相应的支付,但今天进行PC扫码支付时遇到一些编码问题,流程能走通. 调试错误,请回到请求来源地, ...
- PC、h5项目接入第三方支付宝扫码登录、扫码付款
首先介绍一下pc项目接入支付宝扫码支付. 1.pc.移动接入支付宝扫码支付. 其实这个逻辑很简单,前端所需要处理的不是很多,后台会给一个连接,前端只需要将要支付的订单id拼接在这个连接上,然后打开跳转 ...
- ASP.NET Core Web 支付功能接入 微信-扫码支付篇
这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入微信-扫码支付及异步通知功能. 开发环境:Win 10 x64.VS2017 15.6.4..NET Core SDK ...
- 【转载】ASP.NET Core Web 支付功能接入 微信-扫码支付篇
转自:http://www.cnblogs.com/essenroc/p/8630730.html 这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入微信-扫码支付及异步 ...
- ASP.NET Core Web 支付功能接入 微信-扫码支付篇(转)
原文 https://www.cnblogs.com/essenroc/p/8630730.html // 随着版本更迭,新版本可能无法完全适用,请参考仓库内的示例. 这篇文章将介绍ASP.NET C ...
- 记录:c#实现微信,支付宝扫码支付(一)
因为公司系统业务需要,这几天了解了一下微信和支付宝扫码支付的接口,并用c#实现了微信和支付宝扫码支付的功能. 微信支付分为6种支付模式:1.付款码支付,2.native支付,3.jsapi支付,4.a ...
- Java之微信支付(扫码支付模式二)案例实战
摘要:最近的一个项目中涉及到了支付业务,其中用到了微信支付和支付宝支付,在做的过程中也遇到些问题,所以现在总结梳理一下,分享给有需要的人,也为自己以后回顾留个思路. 一:微信支付接入准备工作: 首先, ...
- Spring使用支付宝扫码支付
前一段一直在研究支付宝的扫码支付,不得不说,支付宝的文档写的真是一个烂(起码在下刚开始看的时候是mengbi的).文档上面的示例和demo里面的示例长的完全不一样.往往文档上面的例子很简单,而demo ...
- .NET Core2.0 环境下MVC模式的支付宝扫码支付接口-沙箱环境开发测试
所有配置以及相关信息均可以从PC支付中获取 使用的生成二维码的组件名为QRCoder,该组件引用了一个第三方实现的System.Drawing类库,和支付宝官网类似 当面付SDK为Alipay.Aop ...
随机推荐
- Scala配置环境变量windows
scala下载官网网址:http://www.scala-lang.org/download/ 1.下载scala-2.10.4.msi 2.点击安装scala,默认安装路径 3.配置环境变量 ( ...
- k8s的paas平台
高可靠设计,Etcd 集群,Kubernetes 三主节点,保证集群的高可用性. 基于 GlusterFS /nfs集群,在生产环境和非生产环境下提供存储卷服务. Flannel+VXLAN,提供可靠 ...
- RollingRegression(滚动回归分析)之Python实现
# -*- coding: utf-8 -*-"""Created on Sat Aug 18 11:08:38 2018 @author: acadsoc"& ...
- GIS 基础知识简介
前言 前一段时间,在公司进行了分析 GIS 基础信息的介绍.之所以会有这个介绍以及为什么是我?这个个中缘由说下. 公司不是一个GIS方面的公司,但是由于业务的需要,经常需要用到地图(要和地图打交道), ...
- 云计算(7)---the scheduler of Hadoop
The scheduler of Hadoop Programming MapReduce 在有些情况下,reducer也可以先开始于Map.但为了便于理解,在这儿我们都是使reduce不会早于map ...
- Selenium常用API的使用java语言之8-模拟鼠标操作
通过前面例子了解到,可以使用click()来模拟鼠标的单击操作,现在的Web产品中提供了更丰富的鼠标交互方式, 例如鼠标右击.双击.悬停.甚至是鼠标拖动等功能.在WebDriver中,将这些关于鼠标操 ...
- collection,random,os,sys,序列化模块
一.collection 模块 python拥有一些内置的数据类型,比如 str,list.tuple.dict.set等 collection模块在这些内置的数据类型的基础上,提供了额外的数据类型: ...
- jquery 使用off移除事件 使用one绑定一次事件,on绑定事件后触发多次相同的事件的异常
<!-- jquery 移除事件,绑定一次事件,搜狗 one --> <!DOCTYPE html> <html lang="en"> < ...
- tinymce编辑器从word粘贴公式
很多时候我们用一些管理系统的时候,发布新闻.公告等文字类信息时,希望能很快的将word里面的内容直接粘贴到富文本编辑器里面,然后发布出来.减少排版复杂的工作量. 下面是借用百度doc 来快速实现这个w ...
- Ubuntu上配置vtk开发环境——基于visual studio code 与 gcc
环境说明 vtk版本7.1.1 visual studio 1.16.1 Ubuntu 16.04 + 自带的gcc 编译过程与windows下类似还好,运行自己的代码开始面对cmake与make的各 ...