一、支付寶當面付功能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
