对接支付宝 java sdk 文档

发布时间:2025-06-27 11:49:08 作者:yexindonglai@163.com 阅读(8)

AlipayH5Service

  1. package com;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alipay.api.AlipayApiException;
  4. import com.alipay.api.AlipayClient;
  5. import com.alipay.api.AlipayConfig;
  6. import com.alipay.api.DefaultAlipayClient;
  7. import com.alipay.api.domain.*;
  8. import com.alipay.api.request.*;
  9. import com.alipay.api.response.*;
  10. import java.io.UnsupportedEncodingException;
  11. import java.net.URLEncoder;
  12. import java.nio.charset.StandardCharsets;
  13. import java.util.ArrayList;
  14. import java.util.Arrays;
  15. import java.util.List;
  16. public class AlipayH5Service {
  17. // 沙箱应用公钥
  18. // final static String privateKey = "";
  19. // 沙箱应用id
  20. // public final static String appId = "";
  21. // 沙箱支付宝公钥
  22. // final static String alipayPublicKey = "";
  23. // 沙箱网关
  24. // final static String alipayUrl = "https://openapi-sandbox.dl.alipaydev.com/gateway.do";
  25. // 应用私钥
  26. final static String privateKey = "";
  27. // 支付宝公钥,例如:MIIBIjANBg...
  28. final static String alipayPublicKey = "";
  29. // 应用id
  30. public final static String appId = "";
  31. // 正式网关
  32. final static String alipayUrl = "https://openapi.alipay.com/gateway.do";
  33. // 场景码, 场景码请参阅: https://opendocs.alipay.com/open/20190319114403226822/signscene?pathHash=1e125353&ref=api
  34. final static String SIGN_SCENE = "INDUSTRY|LIFE_PAYMENT";
  35. // final static String SIGN_SCENE = "INDUSTRY|VRPAY";
  36. /**
  37. * 支付并签约- h5
  38. * https://opendocs.alipay.com/pre-open/01o4xw?pathHash=f2af4f63
  39. * @param OutTradeNo
  40. * @param amount
  41. * @return
  42. * @throws AlipayApiException
  43. */
  44. public AlipayTradePagePayResponse signAndPayH5(String OutTradeNo,String ExternalAgreementNo,String amount,String returnUrl) throws AlipayApiException, UnsupportedEncodingException {
  45. // 初始化SDK
  46. AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());
  47. // 构造请求参数以调用接口
  48. AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
  49. AlipayTradePagePayModel model = new AlipayTradePagePayModel();
  50. model.setOutTradeNo(OutTradeNo);
  51. // 设置签约参数
  52. AgreementSignParams agreementSignParams=new AgreementSignParams();
  53. // 外部签约号,
  54. agreementSignParams.setExternalAgreementNo(ExternalAgreementNo);
  55. agreementSignParams.setPersonalProductCode("GENERAL_WITHHOLDING_P");// 固定值
  56. agreementSignParams.setSignScene("INDUSTRY|CARRENTA");// 固定值
  57. model.setAgreementSignParams(agreementSignParams);
  58. // 销售产品码 默认是 GENERAL_WITHHOLDING
  59. model.setProductCode("GENERAL_WITHHOLDING");
  60. model.setIntegrationType("ALIAPP");
  61. // 订单总金额,单位为元,精确到小数点后两位
  62. model.setTotalAmount(amount);
  63. // 订单描述
  64. model.setBody("xxx");
  65. // 订单标题(会出现在账单)
  66. model.setSubject("xxxx");
  67. // model.setPassbackParams(URLEncoder.encode("insureSign=true&orderNo1=20241022174845977020006000075361&productCode=INS101071","UTF-8"));
  68. request.setBizModel(model);
  69. // NotifyUrl是支付回调,
  70. // 文档中没有签约回调的参数,so签约回调需要在应用网关接收
  71. request.setNotifyUrl("https://www.baidu.com");
  72. // 支付成功后自动跳转到指定页面,, url必须编码
  73. request.setReturnUrl(returnUrl);
  74. // 以下2个returnUrl 都会报错
  75. // request.setReturnUrl("https://i-insurance-test.wanyol.com/insurance/policy/result/?insureSign=true&orderNo1=20241022174845977020006000075361&productCode=INS101071");
  76. // request.setReturnUrl("https://i-insurance-test.wanyol.com/insurance/product/details/resultCommon/?orderNo=20241011160125997020006000041672&accessSign=f3da0254a22ad363e1be869796934e16");
  77. AlipayTradePagePayResponse response= null;
  78. try {
  79. System.out.println("params :"+JSON.toJSONString(request));
  80. response = alipayClient.pageExecute(request,"get");
  81. } catch (AlipayApiException e) {
  82. e.printStackTrace();
  83. }
  84. return response;
  85. }
  86. /**
  87. * 支付并签约 pc版
  88. * https://opendocs.alipay.com/open/59da99d0_alipay.trade.page.pay?pathHash=e26b497f&scene=22#%E5%85%AC%E5%85%B1%E8%AF%B7%E6%B1%82%E5%8F%82%E6%95%B0
  89. */
  90. public AlipayTradePagePayResponse payAndSign(String OutTradeNo,String amount) throws AlipayApiException {
  91. // 初始化SDK
  92. AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());
  93. // 构造请求参数以调用接口
  94. AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
  95. AlipayTradePagePayModel model = new AlipayTradePagePayModel();
  96. // 设置商户门店编号
  97. // model.setStoreId("NJ_001");
  98. // 设置订单绝对超时时间
  99. // model.setTimeExpire("2016-12-31 10:05:01");
  100. // 设置业务扩展参数
  101. // ExtendParams extendParams = new ExtendParams();
  102. // extendParams.setSysServiceProviderId("2088511833207846");
  103. // extendParams.setHbFqSellerPercent("100");
  104. // extendParams.setHbFqNum("3");
  105. // extendParams.setIndustryRefluxInfo("{\"scene_code\":\"metro_tradeorder\",\"channel\":\"xxxx\",\"scene_data\":{\"asset_name\":\"ALIPAY\"}}");
  106. // extendParams.setSpecifiedSellerName("XXX的跨境小铺");
  107. // extendParams.setRoyaltyFreeze("true");
  108. // extendParams.setCardType("S0JP0000");
  109. // model.setExtendParams(extendParams);
  110. // 设置订单标题
  111. model.setSubject("Iphone6 16G");
  112. // 设置请求来源地址
  113. model.setRequestFromUrl("https://");
  114. // 设置产品码
  115. model.setProductCode("FAST_INSTANT_TRADE_PAY");
  116. // 设置PC扫码支付的方式
  117. model.setQrPayMode("2");
  118. // 设置商户自定义二维码宽度
  119. // model.setQrcodeWidth(100L);
  120. // 设置请求后页面的集成方式
  121. // model.setIntegrationType("PCWEB");
  122. // 设置订单包含的商品列表信息
  123. // List<GoodsDetail> goodsDetail = new ArrayList<GoodsDetail>();
  124. // GoodsDetail goodsDetail0 = new GoodsDetail();
  125. // goodsDetail0.setGoodsName("ipad");
  126. // goodsDetail0.setAlipayGoodsId("20010001");
  127. // goodsDetail0.setQuantity(1L);
  128. // goodsDetail0.setPrice("2000");
  129. // goodsDetail0.setGoodsId("apple-01");
  130. // goodsDetail0.setGoodsCategory("34543238");
  131. // goodsDetail0.setCategoriesTree("124868003|126232002|126252004");
  132. // goodsDetail0.setShowUrl("http://www.alipay.com/xxx.jpg");
  133. // goodsDetail.add(goodsDetail0);
  134. // model.setGoodsDetail(goodsDetail);
  135. // 设置商户的原始订单号
  136. // model.setMerchantOrderNo("20161008001");
  137. // 设置二级商户信息
  138. // SubMerchant subMerchant = new SubMerchant();
  139. // subMerchant.setMerchantId("2088000603999128");
  140. // subMerchant.setMerchantType("alipay");
  141. // model.setSubMerchant(subMerchant);
  142. // 设置开票信息
  143. // InvoiceInfo invoiceInfo = new InvoiceInfo();
  144. // InvoiceKeyInfo keyInfo = new InvoiceKeyInfo();
  145. // keyInfo.setTaxNum("1464888883494");
  146. // keyInfo.setIsSupportInvoice(true);
  147. // keyInfo.setInvoiceMerchantName("ABC|003");
  148. // invoiceInfo.setKeyInfo(keyInfo);
  149. // invoiceInfo.setDetails("[{\"code\":\"100294400\",\"name\":\"服饰\",\"num\":\"2\",\"sumPrice\":\"200.00\",\"taxRate\":\"6%\"}]");
  150. // model.setInvoiceInfo(invoiceInfo);
  151. // 设置商户订单号
  152. model.setOutTradeNo(OutTradeNo);
  153. // 设置外部指定买家
  154. // ExtUserInfo extUserInfo = new ExtUserInfo();
  155. // extUserInfo.setCertType("IDENTITY_CARD");
  156. // extUserInfo.setCertNo("362334768769238881");
  157. // extUserInfo.setName("李明");
  158. // extUserInfo.setMobile("16587658765");
  159. // extUserInfo.setMinAge("18");
  160. // extUserInfo.setNeedCheckInfo("F");
  161. // extUserInfo.setIdentityHash("27bfcd1dee4f22c8fe8a2374af9b660419d1361b1c207e9b41a754a113f38fcc");
  162. // model.setExtUserInfo(extUserInfo);
  163. // 设置订单总金额
  164. model.setTotalAmount(amount);
  165. // 设置商户传入业务信息
  166. // model.setBusinessParams("{\"mc_create_trade_ip\":\"127.0.0.1\"}");
  167. // 设置优惠参数
  168. // model.setPromoParams("{\"storeIdType\":\"1\"}");
  169. request.setBizModel(model);
  170. // 第三方代调用模式下请设置app_auth_token
  171. // request.putOtherTextParam("app_auth_token", "<-- 请填写应用授权令牌 -->");
  172. // ,POST和GET方法生成内容不同:使用POST方法执行,结果为html form表单,在浏览器渲染即可;使用GET方法会得到支付宝URL,需要打开或重定向到该URL。建议使用POST方式
  173. // AlipayTradePagePayResponse response = alipayClient.pageExecute(request, "POST");
  174. // 如果需要返回GET请求,请使用
  175. AlipayTradePagePayResponse response = alipayClient.pageExecute(request, "GET");
  176. String pageRedirectionData = response.getBody();
  177. System.out.println(pageRedirectionData);
  178. if (response.isSuccess()) {
  179. System.out.println("调用成功");
  180. } else {
  181. System.out.println("调用失败");
  182. // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接
  183. // String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
  184. // System.out.println(diagnosisUrl);
  185. }
  186. return response;
  187. }
  188. /**
  189. * 获取签约链接
  190. * alipay.user.agreement.page.sign(支付宝个人协议页面签约接口)
  191. * https://opendocs.alipay.com/open/02fkan?scene=35
  192. */
  193. public AlipayUserAgreementPageSignResponse getSignUrl(String executeTime, String externalAgreementNo) throws AlipayApiException, UnsupportedEncodingException {
  194. AlipayClient alipayClient = new DefaultAlipayClient(alipayUrl, appId, privateKey, "json", StandardCharsets.UTF_8.name(), alipayPublicKey, "RSA2");
  195. AlipayUserAgreementPageSignRequest request = new AlipayUserAgreementPageSignRequest();
  196. // 签约后跳转的页面, 注意:小程序签约不支持跳转页面,需开发人员自行跳转
  197. // request.setReturnUrl("https://www.baidu.com");
  198. // 回调接口url
  199. // request.setNotifyUrl(""--); TODO
  200. AlipayUserAgreementPageSignModel model = new AlipayUserAgreementPageSignModel();
  201. AccessParams accessParams = new AccessParams();
  202. accessParams.setChannel("ALIPAYAPP");// TODO
  203. model.setAccessParams(accessParams);
  204. /**
  205. * 周期管控规则说明:
  206. * 比方说周期是7天,今天10号进行第一次扣款,下次扣款时间是12-17号之间都能扣款,超过17号,也就18号之后就不能扣款了,如果您这边需要进行扣款,那么就要调用修改接口修改下次扣款时间为18之后的日期;
  207. * 也就是说 今天10号可以扣一次款,下次最快12号就可以扣第二次,
  208. */
  209. //周期管控规则
  210. // PeriodRuleParams periodRuleParams = new PeriodRuleParams();
  211. // // 周期类型PeriodType和周期数Period配合使用 如果 period_type = DAY, period = 7 ,就是每7天都可以扣一次
  212. // periodRuleParams.setPeriodType("DAY"); // //周期类型枚举值为DAY和 MONTH
  213. // periodRuleParams.setPeriod(7L);//周期数,最小值是7天
  214. // //商户发起首次扣款的时间,格式:yyyy-MM-dd ,这个时间必须是在扣款时间的前5天内,比如您设置的execute_time是 1月10号,可以当天扣款,也可以提前五天,扣款时间是01月05号---01月10号,否则扣款时会提示:扣款日期不在签约时的允许范围之内
  215. // periodRuleParams.setExecuteTime(executeTime);
  216. // periodRuleParams.setSingleAmount("0.01"); //每次发起扣款时限制的最大金额单位为元
  217. // periodRuleParams.setTotalAmount("0.02"); //周期内允许扣款的总金额,单位为元
  218. // // //总扣款次数, 可以扣款的期数 ,比如你设置了3 次,你想扣4次款。 那是不允许的,只能扣三次
  219. // periodRuleParams.setTotalPayments(2L);
  220. // model.setPeriodRuleParams(periodRuleParams);
  221. // SubMerchantParams subMerchant = new SubMerchantParams();
  222. // subMerchant.setSubMerchantServiceName("滴滴出行免密支付");
  223. // subMerchant.setSubMerchantServiceDescription("免密付车费,单次最高500");
  224. // subMerchant.setSubMerchantName("滴滴出行");
  225. // subMerchant.setSubMerchantId("2088123412341234");
  226. // model.setSubMerchant(subMerchant);
  227. model.setProductCode("GENERAL_WITHHOLDING"); //非必填
  228. // model.setAgreementEffectType("DIRECT");
  229. // ProdParams prodParams = new ProdParams();
  230. // prodParams.setAuthBizParams("{\"platform\":\"taobao\"}");
  231. // model.setProdParams(prodParams);
  232. // model.setPromoParams("{\"key\":\"value\"}");
  233. /**
  234. * sign_validity_period 和 effect_time 的区别
  235. * 一般使用sign_validity_period参数,effect_time参数是要单独配置的,如果 配置了 effect_time ,sign_validity_period 就会失效
  236. * sign_validity_period 是限制周期是相对周期,唤起签约页面开始计算时间,
  237. * effect_time 就是绝对时间,从调用接口的当前时间开始计算的
  238. */
  239. // 签约有效时间限制,创建好签约单后,必须在指定时间内签约,否则会被拦截 单位是秒,有效范围是0-86400
  240. model.setEffectTime(1800L);// TODO
  241. // 当前用户签约请求的协议有效周期 ,d:天,m:月 ,比如你签约成功了,过了指定时间后就会自动失效,不填则长期有效
  242. // model.setSignValidityPeriod("2d"); // TODO
  243. // model.setExternalLogonId("13852852877");
  244. // 场景码请参阅: https://opendocs.alipay.com/open/20190319114403226822/signscene?pathHash=1e125353&ref=api
  245. model.setSignScene(SIGN_SCENE);
  246. /** 个人签约产品码,商户和支付宝签约时确定,有以下可选值:
  247. * - GENERAL_WITHHOLDING_P 商家代扣 ,没有限制,可以随时扣
  248. * - CYCLE_PAY_AUTH_P 使用商家扣款产品时必传,其它支付产品无需传入 ,商家扣款受周期管控规则限制, 参数为:PeriodRuleParams
  249. * 商家扣款适用于续费会员类业务,商户代扣适用于滴滴打车免密支付类的
  250. */
  251. model.setPersonalProductCode("GENERAL_WITHHOLDING_P");// TODO
  252. // model.setUserAgeRange("{\"min\":\"18\",\"max\":\"30\"}");
  253. // IdentityParams identityParams = new IdentityParams();
  254. // identityParams.setCertNo("61102619921108888");
  255. // identityParams.setIdentityHash("8D969EEF6ECAD3C29A3A629280E686CF0C3F5D5A86AFF3CA12020C923ADC6C92");
  256. // identityParams.setSignUserId("2088202888530893");
  257. // identityParams.setUserName("张三");
  258. // model.setIdentityParams(identityParams);
  259. // 商户签约号,代扣协议中标示用户的唯一签约号(确保在商户系统中唯一)--是否可以用订单号?
  260. model.setExternalAgreementNo(externalAgreementNo);// TODO
  261. // DeviceParams deviceParams = new DeviceParams();
  262. // deviceParams.setDeviceName("保险");
  263. // deviceParams.setDeviceType("BAOXIAN");
  264. // deviceParams.setDeviceId("baoxian1234");
  265. // model.setDeviceParams(deviceParams);
  266. // model.setThirdPartyType("PARTNER");
  267. // ZmAuthParams zmAuthParams = new ZmAuthParams();
  268. // zmAuthParams.setBuckleMerchantId("268820000000414397785");
  269. // zmAuthParams.setBuckleAppId("1001164");
  270. // model.setZmAuthParams(zmAuthParams);
  271. request.setBizModel(model);
  272. // AlipayUserAgreementPageSignResponse response = alipayClient.pageExecute(request,"get");
  273. // System.out.println(response.getBody());
  274. // AlipayUserAgreementPageSignResponse response = alipayClient.sdkExecute(request);
  275. // String signStr = URLEncoder.encode(response.getBody(), "UTF-8");
  276. System.out.println( "参数: " +JSON.toJSONString(request));
  277. return alipayClient.pageExecute(request,"get");
  278. }
  279. private static AlipayConfig getAlipayConfig() {
  280. AlipayConfig alipayConfig = new AlipayConfig();
  281. alipayConfig.setServerUrl(alipayUrl);
  282. alipayConfig.setAppId(appId);
  283. alipayConfig.setPrivateKey(privateKey);
  284. alipayConfig.setFormat("json");
  285. alipayConfig.setAlipayPublicKey(alipayPublicKey);
  286. alipayConfig.setCharset("UTF-8");
  287. alipayConfig.setSignType("RSA2");
  288. return alipayConfig;
  289. }
  290. /**
  291. * h5纯支付
  292. * alipay.trade.wap.pay(手机网站支付接口2.0)
  293. * https://opendocs.alipay.com/open/29ae8cb6_alipay.trade.wap.pay?scene=21&pathHash=1ef587fd
  294. * @throws AlipayApiException
  295. */
  296. public AlipayTradeWapPayResponse h5OnlyPay(String OutTradeNo,String amount,String returnUrl) throws AlipayApiException {
  297. // 初始化SDK
  298. AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());
  299. // 构造请求参数以调用接口
  300. AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
  301. AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
  302. // 设置商户订单号
  303. model.setOutTradeNo(OutTradeNo);
  304. // 设置订单总金额
  305. model.setTotalAmount(amount);
  306. // 设置订单标题
  307. model.setSubject("大乐透");
  308. // 销售产品码,商家和支付宝签约的产品码。手机网站支付为:QUICK_WAP_WAY
  309. model.setProductCode("QUICK_WAP_WAY");
  310. // 设置用户付款中途退出返回商户网站的地址
  311. // model.setQuitUrl("http://www.baidu.com");
  312. // 设置订单包含的商品列表信息
  313. // List<GoodsDetail> goodsDetail = new ArrayList<GoodsDetail>();
  314. // GoodsDetail goodsDetail0 = new GoodsDetail();
  315. // goodsDetail0.setGoodsName("ipad");
  316. // goodsDetail0.setAlipayGoodsId("20010001");
  317. // goodsDetail0.setQuantity(1L);
  318. // goodsDetail0.setPrice("2000");
  319. // goodsDetail0.setGoodsId("apple-01");
  320. // goodsDetail0.setGoodsCategory("34543238");
  321. // goodsDetail0.setCategoriesTree("124868003|126232002|126252004");
  322. // goodsDetail0.setBody("特价手机");
  323. // goodsDetail0.setShowUrl("http://www.alipay.com/xxx.jpg");
  324. // goodsDetail.add(goodsDetail0);
  325. // model.setGoodsDetail(goodsDetail);
  326. // 设置订单绝对超时时间
  327. // model.setTimeExpire("2016-12-31 10:05:00");
  328. // 设置业务扩展参数
  329. // ExtendParams extendParams = new ExtendParams();
  330. // extendParams.setSysServiceProviderId("2088511833207846");
  331. // extendParams.setHbFqSellerPercent("100");
  332. // extendParams.setHbFqNum("3");
  333. // extendParams.setIndustryRefluxInfo("{\"scene_code\":\"metro_tradeorder\",\"channel\":\"xxxx\",\"scene_data\":{\"asset_name\":\"ALIPAY\"}}");
  334. // extendParams.setSpecifiedSellerName("XXX的跨境小铺");
  335. // extendParams.setRoyaltyFreeze("true");
  336. // extendParams.setCardType("S0JP0000");
  337. // model.setExtendParams(extendParams);
  338. // 设置商户传入业务信息
  339. // model.setBusinessParams("{\"mc_create_trade_ip\":\"127.0.0.1\"}");
  340. // 设置公用回传参数
  341. model.setPassbackParams("merchantBizType%3d3C%26merchantBizNo%3d2016010101111");
  342. // 设置商户的原始订单号
  343. // model.setMerchantOrderNo("20161008001");
  344. // 设置外部指定买家
  345. // ExtUserInfo extUserInfo = new ExtUserInfo();
  346. // extUserInfo.setCertType("IDENTITY_CARD");
  347. // extUserInfo.setCertNo("362334768769238881");
  348. // extUserInfo.setName("李明");
  349. // extUserInfo.setMobile("16587658765");
  350. // extUserInfo.setFixBuyer("F");
  351. // extUserInfo.setMinAge("18");
  352. // extUserInfo.setNeedCheckInfo("F");
  353. // extUserInfo.setIdentityHash("27bfcd1dee4f22c8fe8a2374af9b660419d1361b1c207e9b41a754a113f38fcc");
  354. // model.setExtUserInfo(extUserInfo);
  355. request.setBizModel(model);
  356. request.setReturnUrl(returnUrl);
  357. // 第三方代调用模式下请设置app_auth_token
  358. // request.putOtherTextParam("app_auth_token", "<-- 请填写应用授权令牌 -->");
  359. // AlipayTradeWapPayResponse response = alipayClient.pageExecute(request, "POST");
  360. // 如果需要返回GET请求,请使用
  361. AlipayTradeWapPayResponse response = alipayClient.pageExecute(request, "GET");
  362. String pageRedirectionData = response.getBody();
  363. System.out.println(pageRedirectionData);
  364. if (response.isSuccess()) {
  365. System.out.println("调用成功");
  366. } else {
  367. System.out.println("调用失败");
  368. // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接
  369. // String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
  370. // System.out.println(diagnosisUrl);
  371. }
  372. return response;
  373. }
  374. /**
  375. * 电脑网站纯支付
  376. * alipay.trade.page.pay(统一收单下单并支付页面接口)
  377. * https://opendocs.alipay.com/open/59da99d0_alipay.trade.page.pay?pathHash=e26b497f&scene=22
  378. */
  379. public AlipayTradePagePayResponse pcOnlyPay(String OutTradeNo,String amount) throws AlipayApiException {
  380. // 初始化SDK
  381. AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());
  382. // 构造请求参数以调用接口
  383. AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
  384. AlipayTradePagePayModel model = new AlipayTradePagePayModel();
  385. // 设置商户门店编号
  386. // model.setStoreId("NJ_001");
  387. // 设置订单绝对超时时间
  388. // model.setTimeExpire("2016-12-31 10:05:01");
  389. // 设置业务扩展参数
  390. // ExtendParams extendParams = new ExtendParams();
  391. // extendParams.setSysServiceProviderId("2088511833207846");
  392. // extendParams.setHbFqSellerPercent("100");
  393. // extendParams.setHbFqNum("3");
  394. // extendParams.setIndustryRefluxInfo("{\"scene_code\":\"metro_tradeorder\",\"channel\":\"xxxx\",\"scene_data\":{\"asset_name\":\"ALIPAY\"}}");
  395. // extendParams.setSpecifiedSellerName("XXX的跨境小铺");
  396. // extendParams.setRoyaltyFreeze("true");
  397. // extendParams.setCardType("S0JP0000");
  398. // model.setExtendParams(extendParams);
  399. // 设置订单标题
  400. model.setSubject("Iphone6 16G");
  401. // 设置请求来源地址
  402. // model.setRequestFromUrl("https://");
  403. // 设置产品码
  404. model.setProductCode("FAST_INSTANT_TRADE_PAY");
  405. // 设置PC扫码支付的方式
  406. // model.setQrPayMode("1");
  407. // 设置商户自定义二维码宽度
  408. // model.setQrcodeWidth(100L);
  409. // 设置请求后页面的集成方式
  410. // model.setIntegrationType("PCWEB");
  411. // 设置订单包含的商品列表信息
  412. // List<GoodsDetail> goodsDetail = new ArrayList<GoodsDetail>();
  413. // GoodsDetail goodsDetail0 = new GoodsDetail();
  414. // goodsDetail0.setGoodsName("ipad");
  415. // goodsDetail0.setAlipayGoodsId("20010001");
  416. // goodsDetail0.setQuantity(1L);
  417. // goodsDetail0.setPrice("2000");
  418. // goodsDetail0.setGoodsId("apple-01");
  419. // goodsDetail0.setGoodsCategory("34543238");
  420. // goodsDetail0.setCategoriesTree("124868003|126232002|126252004");
  421. // goodsDetail0.setShowUrl("http://www.alipay.com/xxx.jpg");
  422. // goodsDetail.add(goodsDetail0);
  423. // model.setGoodsDetail(goodsDetail);
  424. // 设置商户的原始订单号
  425. // model.setMerchantOrderNo("20161008001");
  426. // 设置二级商户信息
  427. // SubMerchant subMerchant = new SubMerchant();
  428. // subMerchant.setMerchantId("2088000603999128");
  429. // subMerchant.setMerchantType("alipay");
  430. // model.setSubMerchant(subMerchant);
  431. // 设置开票信息
  432. // InvoiceInfo invoiceInfo = new InvoiceInfo();
  433. // InvoiceKeyInfo keyInfo = new InvoiceKeyInfo();
  434. // keyInfo.setTaxNum("1464888883494");
  435. // keyInfo.setIsSupportInvoice(true);
  436. // keyInfo.setInvoiceMerchantName("ABC|003");
  437. // invoiceInfo.setKeyInfo(keyInfo);
  438. // invoiceInfo.setDetails("[{\"code\":\"100294400\",\"name\":\"服饰\",\"num\":\"2\",\"sumPrice\":\"200.00\",\"taxRate\":\"6%\"}]");
  439. // model.setInvoiceInfo(invoiceInfo);
  440. // 设置商户订单号
  441. model.setOutTradeNo(OutTradeNo);
  442. // 设置外部指定买家
  443. // ExtUserInfo extUserInfo = new ExtUserInfo();
  444. // extUserInfo.setCertType("IDENTITY_CARD");
  445. // extUserInfo.setCertNo("362334768769238881");
  446. // extUserInfo.setName("李明");
  447. // extUserInfo.setMobile("16587658765");
  448. // extUserInfo.setMinAge("18");
  449. // extUserInfo.setNeedCheckInfo("F");
  450. // extUserInfo.setIdentityHash("27bfcd1dee4f22c8fe8a2374af9b660419d1361b1c207e9b41a754a113f38fcc");
  451. // model.setExtUserInfo(extUserInfo);
  452. // 设置订单总金额
  453. model.setTotalAmount(amount);
  454. // 设置商户传入业务信息
  455. // model.setBusinessParams("{\"mc_create_trade_ip\":\"127.0.0.1\"}");
  456. // 设置优惠参数
  457. // model.setPromoParams("{\"storeIdType\":\"1\"}");
  458. request.setBizModel(model);
  459. // 第三方代调用模式下请设置app_auth_token
  460. // request.putOtherTextParam("app_auth_token", "<-- 请填写应用授权令牌 -->");
  461. // AlipayTradePagePayResponse response = alipayClient.pageExecute(request, "POST");
  462. System.out.println("params : " + JSON.toJSONString(request));
  463. // 如果需要返回GET请求,请使用
  464. AlipayTradePagePayResponse response = alipayClient.pageExecute(request, "GET");
  465. String pageRedirectionData = response.getBody();
  466. System.out.println(pageRedirectionData);
  467. if (response.isSuccess()) {
  468. System.out.println("调用成功");
  469. } else {
  470. System.out.println("调用失败");
  471. }
  472. return response;
  473. }
  474. /**
  475. * 获取协议号(签约后通过用户签约号获取)
  476. * alipay.user.agreement.query(支付宝个人代扣协议查询接口)
  477. * https://opendocs.alipay.com/open/3dab71bc_alipay.user.agreement.query?pathHash=6706b504&ref=api&scene=common
  478. */
  479. public AlipayUserAgreementQueryResponse getExternalAgreement(String externalAgreementNo,String signScene) throws AlipayApiException {
  480. AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());
  481. AlipayUserAgreementQueryRequest request = new AlipayUserAgreementQueryRequest();
  482. /**
  483. * 如果在支付宝个人协议页面签约接口接口中传递了sign_scene + external_agreement_no 2 个参数,那在对应的协议查询接口中传递personal_product_code+sign_scene+external_agreement_no 3 个参数即可查询到内容。
  484. * 如果在支付宝个人协议页面签约接口接口中没有传递sign_scene + external_agreement_no 2 个参数,那在对应的协议查询接口中传递 personal_product_code+(alipay_logon_id和alipay_user_id 2 个参数中的任何一个参数)即可查询到内容。
  485. */
  486. AlipayUserAgreementQueryModel alipayObject = new AlipayUserAgreementQueryModel();
  487. /** 个人签约产品码,商户和支付宝签约时确定,有以下可选值:
  488. * - GENERAL_WITHHOLDING_P 商家代扣 ,没有限制,可以随时扣
  489. * - CYCLE_PAY_AUTH_P 使用商家扣款产品时必传,其它支付产品无需传入 ,商家扣款受周期管控规则限制, 参数为:PeriodRuleParams
  490. * 商家扣款适用于续费会员类业务,商户代扣适用于滴滴打车免密支付类的
  491. */
  492. alipayObject.setPersonalProductCode("GENERAL_WITHHOLDING_P"); // 协议产品码,商户和支付宝签约时确定
  493. alipayObject.setExternalAgreementNo(externalAgreementNo); // 代扣协议中标示用户的唯一签约号(确保在商户系统中唯一)。
  494. alipayObject.setSignScene(signScene); // 签约场景码,该值需要与系统/页面签约接口调用时传入的值保持一 致
  495. // alipayObject.setPersonalProductCode("CYCLE_PAY_AUTH_P"); // 协议产品码,商户和支付宝签约时确定
  496. // alipayObject.setAlipayLogonId("13510421123");
  497. // alipayObject.setAlipayUserId("2088612598194294");
  498. request.setBizModel(alipayObject);
  499. // TODO 注意事项: 解约后是查不到信息的,提示 :用户协议不存在
  500. AlipayUserAgreementQueryResponse response = alipayClient.execute(request);
  501. return response;
  502. }
  503. /**
  504. * 扣款之前给用户发送通知的,并且发送通知后只能根据这个接口返回的扣款需求去发起扣款
  505. * 调用的时候会发送一次,但是重复调用会有频率限制,每天上限是一个用户只会发送一次
  506. *
  507. *
  508. * alipay.user.agreement.permission.create(支付宝协议支付许可创建、服务变更接口)
  509. * https://opendocs.alipay.com/pre-open/03bqea?pathHash=caba6aee
  510. * @return
  511. * @throws AlipayApiException
  512. */
  513. public AlipayUserAgreementPermissionCreateResponse sendPayNotice(String agreementNo,String totalAmount,String outRequestNo) throws AlipayApiException {
  514. AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());
  515. AlipayUserAgreementPermissionCreateRequest request = new AlipayUserAgreementPermissionCreateRequest();
  516. AlipayUserAgreementPermissionCreateModel model = new AlipayUserAgreementPermissionCreateModel();
  517. model.setAgreementNo(agreementNo); // 签约的协议号
  518. model.setTotalAmount(totalAmount); // 总金额
  519. // 商户请求号。 由商家自定义,64个字符以内,仅支持字母、数字、下划线且需保证在商户端不重复。
  520. model.setOutRequestNo(outRequestNo);
  521. /**
  522. * 通知模版类型
  523. * 默认消息: DEFAULT_PERMISSION (NoticeTemplate不填默认就是 DEFAULT_PERMISSION)
  524. * 服务变更提醒 : SERVIOCE_NOTICE
  525. */
  526. // model.setNoticeTemplate("SERVIOCE_NOTICE");
  527. // // 业务参数,如果notice_template是SERVIOCE_NOTICE时,此参数必传
  528. // BusinessParamsMap businessParamsMap = new BusinessParamsMap();
  529. // businessParamsMap.setChangeTime("2024-11-25 22:22:22");
  530. // businessParamsMap.setOriAmount("0.01");
  531. // businessParamsMap.setNewAmount("0.02");
  532. // model.setBusinessParams(businessParamsMap);
  533. request.setBizModel(model);
  534. AlipayUserAgreementPermissionCreateResponse response = alipayClient.execute(request);
  535. if(response.isSuccess()){
  536. System.out.println("调用成功");
  537. } else {
  538. System.out.println("调用失败");
  539. }
  540. return response;
  541. }
  542. /**
  543. * 签约后发起支付接口(此过程由商户发起,用户无感知,也不需要进行操作,只会收到自动扣款的短信)
  544. * alipay.trade.pay(统一收单交易支付接口)
  545. * https://opendocs.alipay.com/apis/009zj1?scene=common
  546. * <p>
  547. * 发起支付不需要回调,扣款成功后,会 同步返回结果;
  548. */
  549. public AlipayTradePayResponse tradePay(String agreementNo, String outTradeNo,String amount) throws AlipayApiException {
  550. AlipayClient alipayClient = new DefaultAlipayClient(alipayUrl, appId, privateKey, "json", StandardCharsets.UTF_8.name(), alipayPublicKey, "RSA2");
  551. AlipayTradePayRequest request = new AlipayTradePayRequest();
  552. // request.setNotifyUrl("回调地址");
  553. AlipayTradePayModel model = new AlipayTradePayModel();
  554. model.setOutTradeNo(outTradeNo);
  555. model.setProductCode("GENERAL_WITHHOLDING");
  556. model.setTotalAmount(amount);
  557. model.setSubject("测试商品");
  558. // 添加fund_bill_list 表示返回资金明细信息
  559. model.setQueryOptions(Arrays.asList("fund_bill_list"));
  560. AgreementParams agreementParams = new AgreementParams();
  561. agreementParams.setAgreementNo(agreementNo);
  562. // 设置了预通知后,可在这里设置代扣扣款许可编码,将限制扣款金额和时间,相当于变成了 商家扣款模式
  563. // agreementParams.setDeductPermission("");
  564. model.setAgreementParams(agreementParams);
  565. request.setBizModel(model);
  566. AlipayTradePayResponse response = alipayClient.execute(request);
  567. return response;
  568. }
  569. }

AlipayService

  1. package com;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.alipay.api.*;
  6. import com.alipay.api.domain.*;
  7. import com.alipay.api.request.*;
  8. import com.alipay.api.response.*;
  9. import com.util.DateUtil;
  10. import java.io.UnsupportedEncodingException;
  11. import java.net.URLEncoder;
  12. import java.nio.charset.StandardCharsets;
  13. import java.util.Arrays;
  14. import java.util.Date;
  15. import java.util.UUID;
  16. public class AlipayService {
  17. // 应用私钥
  18. final static String privateKey = "";
  19. // 支付宝公钥,例如:MIIBIjANBg...
  20. final static String alipayPublicKey = "";
  21. // 应用id
  22. final static String appId = "";
  23. final static String alipayUrl = "https://openapi.alipay.com/gateway.do";
  24. // 场景码, 场景码请参阅: https://opendocs.alipay.com/open/20190319114403226822/signscene?pathHash=1e125353&ref=api
  25. final static String SIGN_SCENE = "INDUSTRY|LIFE_PAYMENT";
  26. // final static String SIGN_SCENE = "INDUSTRY|VRPAY";
  27. /**
  28. * alipay.system.oauth.token(换取授权访问令牌)
  29. * 流程:https://opendocs.alipay.com/mini/api/openapi-authorize?pathHash=22642781
  30. * api文档: https://opendocs.alipay.com/open/02xtla
  31. */
  32. public AlipaySystemOauthTokenResponse getAccessToken(String authCode) throws AlipayApiException {
  33. AlipayConfig alipayConfig = new AlipayConfig();
  34. alipayConfig.setServerUrl(alipayUrl);
  35. alipayConfig.setAppId(appId);
  36. alipayConfig.setPrivateKey(privateKey);
  37. alipayConfig.setFormat("json");
  38. alipayConfig.setAlipayPublicKey(alipayPublicKey);
  39. alipayConfig.setCharset(StandardCharsets.UTF_8.name());
  40. alipayConfig.setSignType("RSA2");
  41. AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
  42. AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
  43. request.setCode(authCode);
  44. request.setGrantType("authorization_code");
  45. // request.setRefreshToken("201208134b203fe6c11548bcabd8da5bb087a83b"); // GrantType 为 authorization_code,这个可以不传
  46. AlipaySystemOauthTokenResponse response = alipayClient.execute(request);
  47. System.out.println(response.getBody());
  48. if (response.isSuccess()) {
  49. System.out.println("调用成功");
  50. } else {
  51. System.out.println("调用失败");
  52. // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接
  53. // String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
  54. // System.out.println(diagnosisUrl);
  55. }
  56. return response;
  57. }
  58. /**
  59. * 获取用户信息
  60. * alipay.user.info.share(支付宝会员授权信息查询接口)
  61. * api文档: https://opendocs.alipay.com/open/02xtlb#5%20%E8%AF%B7%E6%B1%82%E7%A4%BA%E4%BE%8B
  62. */
  63. public AlipayUserInfoShareResponse getUserInfo(String token) throws AlipayApiException {
  64. AlipayClient alipayClient = new DefaultAlipayClient(alipayUrl, appId, privateKey, "json", StandardCharsets.UTF_8.name(), alipayPublicKey, "RSA2");
  65. AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest();
  66. AlipayUserInfoShareResponse response = alipayClient.execute(request, token);
  67. String jsonString = JSON.toJSONString(response);
  68. System.out.println("响应结果:" + jsonString);
  69. if (response.isSuccess()) {
  70. System.out.println("调用成功");
  71. } else {
  72. System.out.println("调用失败");
  73. }
  74. return response;
  75. }
  76. /**
  77. * 创建支付订单
  78. * alipay.trade.create(统一收单交易创建接口)
  79. * https://opendocs.alipay.com/mini/03l5wn
  80. *
  81. * @return
  82. */
  83. public AlipayTradeCreateResponse createTradeOrder(String userId) throws AlipayApiException {
  84. AlipayClient alipayClient = new DefaultAlipayClient(alipayUrl, appId, privateKey, "json", StandardCharsets.UTF_8.name(), alipayPublicKey, "RSA2");
  85. //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.create.
  86. AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
  87. //SDK 已经封装掉了公共参数,这里只需要传入业务参数。
  88. JSONObject bizContent = new JSONObject();
  89. // 订单号,由商户生成,必须唯一
  90. UUID uuid = UUID.randomUUID();
  91. bizContent.put("out_trade_no", uuid.toString().replaceAll("-", ""));
  92. //付款金额
  93. bizContent.put("total_amount", "0.01");
  94. //必填,商品的标题/交易标题/订单标题/订单关键字等。 不可使用特殊字符,如 /,=,& 等。
  95. bizContent.put("subject", "test");
  96. //用户id
  97. bizContent.put("buyer_id", userId);
  98. //回调地址
  99. // bizContent.put("notify_url","");
  100. String jsonString = bizContent.toJSONString();
  101. System.out.println("参数:" + jsonString);
  102. request.setBizContent(jsonString);
  103. try {
  104. AlipayTradeCreateResponse response = alipayClient.execute(request);
  105. String trade_no = response.getTradeNo();// 获取返回的tradeNO。
  106. System.out.println("trade_no: " + trade_no);
  107. return response;
  108. } catch (AlipayApiException e) {
  109. e.printStackTrace();
  110. throw e;
  111. }
  112. }
  113. /**
  114. * 查询支付结果
  115. * alipay.trade.query(统一收单交易查询)
  116. * https://opendocs.alipay.com/mini/03l4kc?scene=common&pathHash=ee5a7444
  117. *
  118. * @return
  119. * @throws AlipayApiException
  120. */
  121. public AlipayTradeQueryResponse getPayResult(String tradeNo) throws AlipayApiException {
  122. AlipayClient alipayClient = new DefaultAlipayClient(alipayUrl, appId, privateKey, "json", StandardCharsets.UTF_8.name(), alipayPublicKey, "RSA2");
  123. AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
  124. AlipayTradeQueryModel model = new AlipayTradeQueryModel();
  125. // trade_no 和 out_trade_no 二选一
  126. // model.setOutTradeNo();
  127. model.setTradeNo(tradeNo);
  128. // 添加fund_bill_list 表示返回资金明细信息
  129. model.setQueryOptions(Arrays.asList("fund_bill_list"));
  130. request.setBizModel(model);
  131. AlipayTradeQueryResponse response = alipayClient.execute(request);
  132. return response;
  133. }
  134. /**
  135. * 获取签约字符串
  136. * alipay.user.agreement.page.sign(支付宝个人协议页面签约接口)
  137. * https://opendocs.alipay.com/open/02fkan?scene=35
  138. */
  139. public AlipayUserAgreementPageSignResponse getSignContact(String executeTime, String externalAgreementNo) throws AlipayApiException, UnsupportedEncodingException {
  140. AlipayClient alipayClient = new DefaultAlipayClient(alipayUrl, appId, privateKey, "json", StandardCharsets.UTF_8.name(), alipayPublicKey, "RSA2");
  141. AlipayUserAgreementPageSignRequest request = new AlipayUserAgreementPageSignRequest();
  142. // 签约后跳转的页面, 注意:小程序签约不支持跳转页面,需开发人员自行跳转
  143. // request.setReturnUrl("https://www.baidu.com");
  144. // 回调接口url
  145. // request.setNotifyUrl(""--); TODO
  146. AlipayUserAgreementPageSignModel model = new AlipayUserAgreementPageSignModel();
  147. AccessParams accessParams = new AccessParams();
  148. accessParams.setChannel("ALIPAYAPP");// TODO
  149. model.setAccessParams(accessParams);
  150. /**
  151. * 周期管控规则说明:
  152. * 比方说周期是7天,今天10号进行第一次扣款,下次扣款时间是12-17号之间都能扣款,超过17号,也就18号之后就不能扣款了,如果您这边需要进行扣款,那么就要调用修改接口修改下次扣款时间为18之后的日期;
  153. * 也就是说 今天10号可以扣一次款,下次最快12号就可以扣第二次,
  154. */
  155. //周期管控规则
  156. PeriodRuleParams periodRuleParams = new PeriodRuleParams();
  157. // 周期类型PeriodType和周期数Period配合使用 如果 period_type = DAY, period = 7 ,就是每7天都可以扣一次
  158. periodRuleParams.setPeriodType("DAY"); // //周期类型枚举值为DAY和 MONTH
  159. periodRuleParams.setPeriod(7L);//周期数,最小值是7天
  160. //商户发起首次扣款的时间,格式:yyyy-MM-dd ,这个时间必须是在扣款时间的前5天内,比如您设置的execute_time是 1月10号,可以当天扣款,也可以提前五天,扣款时间是01月05号---01月10号,否则扣款时会提示:扣款日期不在签约时的允许范围之内
  161. periodRuleParams.setExecuteTime(executeTime);
  162. periodRuleParams.setSingleAmount("0.01"); //每次发起扣款时限制的最大金额单位为元
  163. periodRuleParams.setTotalAmount("0.02"); //周期内允许扣款的总金额,单位为元
  164. // //总扣款次数, 可以扣款的期数 ,比如你设置了3 次,你想扣4次款。 那是不允许的,只能扣三次
  165. periodRuleParams.setTotalPayments(2L);
  166. model.setPeriodRuleParams(periodRuleParams);
  167. // SubMerchantParams subMerchant = new SubMerchantParams();
  168. // subMerchant.setSubMerchantServiceName("滴滴出行免密支付");
  169. // subMerchant.setSubMerchantServiceDescription("免密付车费,单次最高500");
  170. // subMerchant.setSubMerchantName("滴滴出行");
  171. // subMerchant.setSubMerchantId("2088123412341234");
  172. // model.setSubMerchant(subMerchant);
  173. model.setProductCode("GENERAL_WITHHOLDING"); //非必填
  174. // model.setAgreementEffectType("DIRECT");
  175. // ProdParams prodParams = new ProdParams();
  176. // prodParams.setAuthBizParams("{\"platform\":\"taobao\"}");
  177. // model.setProdParams(prodParams);
  178. // model.setPromoParams("{\"key\":\"value\"}");
  179. /**
  180. * sign_validity_period 和 effect_time 的区别
  181. * 一般使用sign_validity_period参数,effect_time参数是要单独配置的,如果 配置了 effect_time ,sign_validity_period 就会失效
  182. * sign_validity_period 是限制周期是相对周期,唤起签约页面开始计算时间,
  183. * effect_time 就是绝对时间,从调用接口的当前时间开始计算的
  184. */
  185. // 签约有效时间限制,创建好签约单后,必须在指定时间内签约,否则会被拦截 单位是秒,有效范围是0-86400
  186. model.setEffectTime(1800L);// TODO
  187. // 当前用户签约请求的协议有效周期 ,d:天,m:月 ,比如你生成了一个协议,用户一直没有签约,你设置了2d表示两天过期, 过了两天之后,用户就不能签了
  188. model.setSignValidityPeriod("2d"); // TODO
  189. // model.setExternalLogonId("13852852877");
  190. // 场景码请参阅: https://opendocs.alipay.com/open/20190319114403226822/signscene?pathHash=1e125353&ref=api
  191. model.setSignScene(SIGN_SCENE);
  192. /** 个人签约产品码,商户和支付宝签约时确定,有以下可选值:
  193. * - GENERAL_WITHHOLDING_P 商家代扣 ,没有限制,可以随时扣
  194. * - CYCLE_PAY_AUTH_P 使用商家扣款产品时必传,其它支付产品无需传入 ,商家扣款受周期管控规则限制, 参数为:PeriodRuleParams
  195. * 商家扣款适用于续费会员类业务,商户代扣适用于滴滴打车免密支付类的
  196. */
  197. model.setPersonalProductCode("CYCLE_PAY_AUTH_P");// TODO
  198. // model.setUserAgeRange("{\"min\":\"18\",\"max\":\"30\"}");
  199. // IdentityParams identityParams = new IdentityParams();
  200. // identityParams.setCertNo("61102619921108888");
  201. // identityParams.setIdentityHash("8D969EEF6ECAD3C29A3A629280E686CF0C3F5D5A86AFF3CA12020C923ADC6C92");
  202. // identityParams.setSignUserId("2088202888530893");
  203. // identityParams.setUserName("张三");
  204. // model.setIdentityParams(identityParams);
  205. // 商户签约号,代扣协议中标示用户的唯一签约号(确保在商户系统中唯一)--是否可以用订单号?
  206. model.setExternalAgreementNo(externalAgreementNo);// TODO
  207. // DeviceParams deviceParams = new DeviceParams();
  208. // deviceParams.setDeviceName("保险");
  209. // deviceParams.setDeviceType("BAOXIAN");
  210. // deviceParams.setDeviceId("baoxian1234");
  211. // model.setDeviceParams(deviceParams);
  212. // model.setThirdPartyType("PARTNER");
  213. // ZmAuthParams zmAuthParams = new ZmAuthParams();
  214. // zmAuthParams.setBuckleMerchantId("268820000000414397785");
  215. // zmAuthParams.setBuckleAppId("1001164");
  216. // model.setZmAuthParams(zmAuthParams);
  217. request.setBizModel(model);
  218. // AlipayUserAgreementPageSignResponse response = alipayClient.pageExecute(request,"get");
  219. // System.out.println(response.getBody());
  220. AlipayUserAgreementPageSignResponse response = alipayClient.sdkExecute(request);
  221. // String signStr = URLEncoder.encode(response.getBody(), "UTF-8");
  222. return response;
  223. }
  224. /**
  225. * 签约后发起支付接口(此过程由商户发起,用户无感知,也不需要进行操作,只会收到自动扣款的短信)
  226. * alipay.trade.pay(统一收单交易支付接口)
  227. * https://opendocs.alipay.com/open/38d751b1_alipay.trade.pay?scene=32&pathHash=0a222003
  228. * <p>
  229. * 发起支付不需要回调,扣款成功后,会 同步返回结果;
  230. */
  231. public AlipayTradePayResponse tradePay(String agreementNo, String outTradeNo) throws AlipayApiException {
  232. AlipayClient alipayClient = new DefaultAlipayClient(alipayUrl, appId, privateKey, "json", StandardCharsets.UTF_8.name(), alipayPublicKey, "RSA2");
  233. AlipayTradePayRequest request = new AlipayTradePayRequest();
  234. // request.setNotifyUrl("回调地址");
  235. AlipayTradePayModel model = new AlipayTradePayModel();
  236. model.setOutTradeNo(outTradeNo);
  237. model.setProductCode("GENERAL_WITHHOLDING");
  238. model.setTotalAmount("0.01");
  239. model.setSubject("测试商品");
  240. // 添加fund_bill_list 表示返回资金明细信息
  241. model.setQueryOptions(Arrays.asList("fund_bill_list"));
  242. AgreementParams agreementParams = new AgreementParams();
  243. agreementParams.setAgreementNo(agreementNo);
  244. model.setAgreementParams(agreementParams);
  245. request.setBizModel(model);
  246. // JSONObject bizContent = new JSONObject();
  247. // // 外部订单号,由商户生成,必须唯一
  248. // bizContent.put("out_trade_no", outTradeNo);
  249. // //商家扣款产品码固定为GENERAL_WITHHOLDING
  250. // bizContent.put("product_code", "GENERAL_WITHHOLDING");
  251. // // 支付金额
  252. // bizContent.put("total_amount", 0.01);
  253. // // 标题
  254. // bizContent.put("subject", "测试商品");
  255. // JSONObject agreement_params = new JSONObject();
  256. // // 协议号
  257. // agreement_params.put("agreement_no", agreementNo); //-- 用户签约后会通过 notify_url 回调,回调的内容里面就有个签约号,参数为: agreement_no
  258. // bizContent.put("agreement_params", agreement_params);
  259. //// 商品明细信息
  260. //JSONArray goodsDetail = new JSONArray();
  261. //JSONObject goods1 = new JSONObject();
  262. //goods1.put("goods_id", "goodsNo1");
  263. //goods1.put("goods_name", "子商品1");
  264. //goods1.put("quantity", 1);
  265. //goods1.put("price", 0.01);
  266. //goodsDetail.add(goods1);
  267. //bizContent.put("goods_detail", goodsDetail);
  268. //// 扩展信息
  269. //JSONObject extendParams = new JSONObject();
  270. //extendParams.put("sys_service_provider_id", "2088511833207846");
  271. //bizContent.put("extend_params", extendParams);
  272. //// 结算信息
  273. //JSONObject settleInfo = new JSONObject();
  274. //JSONArray settleDetailInfos = new JSONArray();
  275. //JSONObject settleDetail = new JSONObject();
  276. //settleDetail.put("trans_in_type", "defaultSettle");
  277. //settleDetail.put("amount", 0.01);
  278. //settleDetailInfos.add(settleDetail);
  279. //settleInfo.put("settle_detail_infos", settleDetailInfos);
  280. //bizContent.put("settle_info", settleInfo);
  281. //// 二级商户信息
  282. //JSONObject subMerchant = new JSONObject();
  283. //subMerchant.put("merchant_id", "2088000603999128");
  284. //bizContent.put("sub_merchant", subMerchant);
  285. //// 业务参数信息
  286. //JSONObject businessParams = new JSONObject();
  287. //businessParams.put("busi_params_key", "busiParamsValue");
  288. //bizContent.put("business_params", businessParams);
  289. //// 营销信息
  290. //JSONObject promoParams = new JSONObject();
  291. //promoParams.put("promo_params_key", "promoParamsValue");
  292. //bizContent.put("promo_params", promoParams);
  293. //// 返回参数选项
  294. //JSONArray queryOptions = new JSONArray();
  295. //queryOptions.add("fund_bill_list");
  296. //queryOptions.add("voucher_detail_list");
  297. //bizContent.put("query_options", queryOptions);
  298. // request.setBizContent(bizContent.toString());
  299. AlipayTradePayResponse response = alipayClient.execute(request);
  300. return response;
  301. }
  302. /**
  303. * 获取协议号(签约后通过用户签约号获取)
  304. * alipay.user.agreement.query(支付宝个人代扣协议查询接口)
  305. * https://opendocs.alipay.com/open/3dab71bc_alipay.user.agreement.query?pathHash=6706b504&ref=api&scene=common
  306. */
  307. public AlipayUserAgreementQueryResponse getExternalAgreement(String externalAgreementNo) throws AlipayApiException {
  308. AlipayClient alipayClient = new DefaultAlipayClient(alipayUrl, appId, privateKey, "json", StandardCharsets.UTF_8.name(), alipayPublicKey, "RSA2");
  309. AlipayUserAgreementQueryRequest request = new AlipayUserAgreementQueryRequest();
  310. /**
  311. * 如果在支付宝个人协议页面签约接口接口中传递了sign_scene + external_agreement_no 2 个参数,那在对应的协议查询接口中传递personal_product_code+sign_scene+external_agreement_no 3 个参数即可查询到内容。
  312. * 如果在支付宝个人协议页面签约接口接口中没有传递sign_scene + external_agreement_no 2 个参数,那在对应的协议查询接口中传递 personal_product_code+(alipay_logon_id和alipay_user_id 2 个参数中的任何一个参数)即可查询到内容。
  313. */
  314. AlipayUserAgreementQueryModel alipayObject = new AlipayUserAgreementQueryModel();
  315. /** 个人签约产品码,商户和支付宝签约时确定,有以下可选值:
  316. * - GENERAL_WITHHOLDING_P 商家代扣 ,没有限制,可以随时扣
  317. * - CYCLE_PAY_AUTH_P 使用商家扣款产品时必传,其它支付产品无需传入 ,商家扣款受周期管控规则限制, 参数为:PeriodRuleParams
  318. * 商家扣款适用于续费会员类业务,商户代扣适用于滴滴打车免密支付类的
  319. */
  320. alipayObject.setPersonalProductCode("CYCLE_PAY_AUTH_P"); // 协议产品码,商户和支付宝签约时确定
  321. alipayObject.setExternalAgreementNo(externalAgreementNo); // 代扣协议中标示用户的唯一签约号(确保在商户系统中唯一)。
  322. alipayObject.setSignScene(SIGN_SCENE); // 签约场景码,该值需要与系统/页面签约接口调用时传入的值保持一 致
  323. alipayObject.setPersonalProductCode("CYCLE_PAY_AUTH_P"); // 协议产品码,商户和支付宝签约时确定
  324. alipayObject.setAlipayLogonId("13510421123");
  325. // alipayObject.setAlipayUserId("2088612598194294");
  326. request.setBizModel(alipayObject);
  327. // TODO 注意事项: 解约后是查不到信息的,提示 :用户协议不存在
  328. AlipayUserAgreementQueryResponse response = alipayClient.execute(request);
  329. return response;
  330. }
  331. /**
  332. * 退款
  333. * https://opendocs.alipay.com/open/de34d4fa_alipay.trade.refund?scene=common&pathHash=46ea3fea
  334. * alipay.trade.refund(统一收单交易退款接口)
  335. */
  336. public AlipayTradeRefundResponse refund(String outTradeNo,String tradeNo, String outRequestNo, String refundAmount) throws AlipayApiException {
  337. /**
  338. * 退款同步响应数据判断(https://opendocs.alipay.com/support/01rawa)
  339. * • alipay.trade.refund(统一收单交易退款接口)调用成功即 alipay_trade_refund_response 返回 "code":"10000","msg":"Success",仅表示接口调用成功,不代表退款是否成功。
  340. * • 退款是否成功可以根据同步响应的 fund_change 参数来判断,fund_change 表示本次退款是否发生了资金变化,返回 Y 表示退款成功,返回 N 则表示本次退款未发生资金变动 。
  341. * • fund_change(本次退款是否发生了资金变化)是指本次接口请求是否资金变动,不是指该笔交易是否资金变动。如果第一次退款成功,返回 Y,但是相同参数(如 out_request_no 不变)第二次请求则会返回 N。商家如果退款成功,但未保存是否响应参数,建议使用退款查询接口进行判断,而不是使用相同参数重新请求判断。
  342. * • 退款接口返回 fund_change=N 不代表交易没有退款,只是代表该次接口请求没有资金变动,此时需使用退款查询接口(alipay.trade.fastpay.refund.query)进行查询判断,该笔交易是退款失败,还是退款成功后重复操作导致。
  343. */
  344. AlipayClient alipayClient = new DefaultAlipayClient(alipayUrl, appId, privateKey, "json", StandardCharsets.UTF_8.name(), alipayPublicKey, "RSA2");
  345. AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
  346. AlipayTradeRefundModel model = new AlipayTradeRefundModel();
  347. // 支付宝交易号和 商户订单号 二选一即可
  348. model.setTradeNo(tradeNo); // 支付宝交易号
  349. model.setOutTradeNo(outTradeNo); // 商户订单号。 订单支付时传入的商户订单号
  350. // 退款金额
  351. model.setRefundAmount(refundAmount);
  352. // 退款请求号。 标识一次退款请求,需要保证在交易号下唯一,如需部分退款,则此参数必传。 注:针对同一次退款请求,如果调用接口失败或异常了,重试时需要保证退款请求号不能变更,防止该笔交易重复退款。支付宝会保证同样的退款请求号多次请求只会退一次。
  353. model.setOutRequestNo(outRequestNo);
  354. request.setBizModel(model);
  355. AlipayTradeRefundResponse response = alipayClient.execute(request);
  356. if (response.isSuccess()) {
  357. System.out.println("调用成功");
  358. } else {
  359. System.out.println("调用失败");
  360. }
  361. return response;
  362. }
  363. /**
  364. * 查询退款信息
  365. * alipay.trade.fastpay.refund.query(统一收单交易退款查询)
  366. * https://opendocs.alipay.com/open/02ekfl
  367. */
  368. public AlipayTradeFastpayRefundQueryResponse queryRefundInfo(String outTradeNo,String outRequestNo) throws AlipayApiException {
  369. /**
  370. * 如何判断退款成功((https://opendocs.alipay.com/support/01rawa))
  371. * - 商户退款后或者退款返回 fund_change=N,可使用 alipay.trade.fastpay.refund.query(统一收单交易退款查询)查询 alipay.trade.refund 提交的退款请求是否执行退款成功。
  372. * - 退款查询接口返回 10000,success,仅代表本次接口请求成功,不代表退款成功。
  373. * - 退款查询接口的 trade_no、out_trade_no、out_request_no 必须和退款接口保持一致,否则交易号一致,out_request_no 不同,只会返回 10000,success,但是没有具体的退款信息。
  374. * - 退款查询接口返回 refund_status=REFUND_SUCCESS 表示退款处理成功,否则表示退款没有执行成功。
  375. * - 说明:如果退款查询发起时间早于退款时间,或者间隔退款发起时间太短,可能出现退款查询时还没处理成功,后面又处理成功的情况,建议商户在退款发起后间隔 10 秒以上再发起退款查询请求。
  376. * - 如果接口未退款成功且不明确交易情况时,重试请务必保证退款请求号 out_request_no 以及请求参数一致,避免发生多次退款。
  377. */
  378. AlipayClient alipayClient = new DefaultAlipayClient(alipayUrl, appId, privateKey, "json", StandardCharsets.UTF_8.name(), alipayPublicKey, "RSA2");
  379. AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest();
  380. AlipayTradeFastpayRefundQueryModel model = new AlipayTradeFastpayRefundQueryModel();
  381. // 退款请求号。 请求退款接口时,传入的退款请求号,如果在退款请求时未传入,则该值为创建交易时的商户订单号。
  382. model.setOutRequestNo(outRequestNo);
  383. // tradeNo 和 outTradeNo 二选一 即可
  384. // model.setTradeNo();
  385. model.setOutTradeNo(outTradeNo);
  386. /** 返回参数选项, 查询选项,商户通过上送该参数来定制同步需要额外返回的信息字段,数组格式。枚举支持:
  387. // refund_detail_item_list:本次退款使用的资金渠道;
  388. // gmt_refund_pay:退款执行成功的时间;
  389. // deposit_back_info:银行卡冲退信息; **/
  390. //JSONArray queryOptions = new JSONArray();
  391. //queryOptions.add("refund_detail_item_list");
  392. //bizContent.put("query_options", queryOptions);
  393. request.setBizModel(model);
  394. AlipayTradeFastpayRefundQueryResponse response = alipayClient.execute(request);
  395. if(response.isSuccess()){
  396. System.out.println("调用成功");
  397. } else {
  398. System.out.println("调用失败");
  399. }
  400. return response;
  401. }
  402. /**
  403. * 签约后修改付款时间(签约后延期扣款)
  404. * alipay.user.agreement.executionplan.modify(周期性扣款协议执行计划修改接口)
  405. * https://opendocs.alipay.com/open/ed428330_alipay.user.agreement.executionplan.modify?pathHash=e019f106
  406. */
  407. public AlipayUserAgreementExecutionplanModifyResponse updatePayTime(String agreementNo, String date) throws AlipayApiException {
  408. AlipayClient alipayClient = new DefaultAlipayClient(alipayUrl, appId, privateKey, "json", StandardCharsets.UTF_8.name(), alipayPublicKey, "RSA2");
  409. AlipayUserAgreementExecutionplanModifyRequest request = new AlipayUserAgreementExecutionplanModifyRequest();
  410. AlipayUserAgreementExecutionplanModifyModel model = new AlipayUserAgreementExecutionplanModifyModel();
  411. JSONObject bizContent = new JSONObject();
  412. bizContent.put("agreement_no", agreementNo);
  413. bizContent.put("deduct_time", date);
  414. bizContent.put("memo", "延期");
  415. request.setBizContent(bizContent.toJSONString());
  416. // request.setBizContent("{" +
  417. // "\"agreement_no\":\""+agreementNo+"\"," +
  418. // "\"deduct_time\":\""+date+"\"," +
  419. // "\"memo\":\"延期\"" +
  420. // " }");
  421. AlipayUserAgreementExecutionplanModifyResponse response = alipayClient.execute(request);
  422. if (response.isSuccess()) {
  423. System.out.println("调用成功");
  424. } else {
  425. System.out.println("调用失败");
  426. }
  427. return response;
  428. }
  429. /**
  430. * 解约
  431. * alipay.user.agreement.unsign(支付宝个人代扣协议解约接口)
  432. * https://opendocs.alipay.com/open/08bntt?pathHash=6d2d4910&scene=common
  433. */
  434. public AlipayUserAgreementUnsignResponse unsign(String agreementNo) throws AlipayApiException {
  435. AlipayClient alipayClient = new DefaultAlipayClient(alipayUrl, appId, privateKey, "json", StandardCharsets.UTF_8.name(), alipayPublicKey, "RSA2");
  436. AlipayUserAgreementUnsignRequest request = new AlipayUserAgreementUnsignRequest();
  437. AlipayUserAgreementUnsignModel model = new AlipayUserAgreementUnsignModel();
  438. // 支付宝系统中用以唯一标识用户签约记录的编号(用户签约成功后的协议号 ),如果传了该参数,其他参数会被忽略 。
  439. model.setAgreementNo(agreementNo);
  440. request.setBizModel(model);
  441. // request.setBizContent("{" +
  442. // " \"alipay_user_id\":\"2088101143488930\"," +
  443. // " \"alipay_logon_id\":\"abx@alitest.com\"," +
  444. // " \"personal_product_code\":\"GENERAL_WITHHOLDING_P\"," +
  445. // " \"sign_scene\":\"INDUSTRY|MEDICA\"," +
  446. // " \"external_agreement_no\":\"test\"," +
  447. // " \"third_party_type\":\"PARTNER\"," +
  448. // " \"agreement_no\":\"20170322450983769228\"," +
  449. // " \"extend_params\":\"{\\\"UNSIGN_ERROR_CODE\\\": \\\"USER_OWE_MONEY\\\",\\\"UNSIGN_ERROR_INFO\\\":\\\"10.00\\\"}\"," +
  450. // " \"operate_type\":\"confirm\"" +
  451. // "}");
  452. AlipayUserAgreementUnsignResponse response = alipayClient.execute(request);
  453. if (response.isSuccess()) {
  454. System.out.println("调用成功");
  455. } else {
  456. System.out.println("调用失败");
  457. }
  458. return response;
  459. }
  460. /**
  461. * 创建支付交易单(纯支付)
  462. * alipay.trade.create(统一收单交易创建接口)
  463. * https://opendocs.alipay.com/apis/api_1/alipay.trade.create/
  464. *
  465. * @return
  466. * @throws AlipayApiException
  467. */
  468. public AlipayTradeCreateResponse tradeCreate(String outTradeNo, String amount, String userId) throws AlipayApiException {
  469. AlipayClient alipayClient = new DefaultAlipayClient(alipayUrl, appId, privateKey, "json", StandardCharsets.UTF_8.name(), alipayPublicKey, "RSA2");
  470. AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
  471. request.setNotifyUrl("");
  472. AlipayTradeCreateModel model = new AlipayTradeCreateModel();
  473. model.setOutTradeNo(outTradeNo);
  474. model.setSubject("支付商品"); // 标题
  475. model.setTotalAmount(amount);// 支付金额
  476. model.setBuyerId(userId); // 支付宝用户id,2088开头
  477. model.setTimeoutExpress("720m");// 订单相对超时时间。从交易创建时间开始计算, 当面付场景默认值为3h
  478. request.setBizModel(model);
  479. // JSONObject bizContent = new JSONObject();
  480. // bizContent.put("out_trade_no", outTradeNo);
  481. // bizContent.put("total_amount", 0.01);
  482. // bizContent.put("subject", "测试商品");
  483. // bizContent.put("buyer_id", "2088102146225135");
  484. // bizContent.put("timeout_express", "10m");
  485. // request.setBizContent(bizContent.toString());
  486. AlipayTradeCreateResponse response = alipayClient.execute(request);
  487. if (response.isSuccess()) {
  488. System.out.println("调用成功");
  489. } else {
  490. System.out.println("调用失败");
  491. // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接
  492. // String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
  493. // System.out.println(diagnosisUrl);
  494. }
  495. return response;
  496. }
  497. /**
  498. * 支付并签约
  499. *
  500. * @param outTradeNo
  501. * @return
  502. * @throws AlipayApiException
  503. */
  504. public AlipayTradeCreateResponse signAndPay(String outTradeNo,String userId) throws AlipayApiException {
  505. AlipayClient alipayClient = new DefaultAlipayClient(alipayUrl, appId, privateKey, "json", StandardCharsets.UTF_8.name(), alipayPublicKey, "RSA2");
  506. AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
  507. // 支付结果回调地址
  508. request.setNotifyUrl("");
  509. AlipayTradeCreateModel tradeCreateModel = new AlipayTradeCreateModel();
  510. tradeCreateModel.setOutTradeNo(outTradeNo);
  511. tradeCreateModel.setTotalAmount("0.01"); // 支付金额
  512. tradeCreateModel.setSubject("测试商品"); // 标题
  513. tradeCreateModel.setProductCode("JSAPI_PAY");// 小程序场景支付:JSAPI_PAY
  514. tradeCreateModel.setBuyerId(userId); // 用户id
  515. tradeCreateModel.setTimeoutExpress("720m");// 订单相对超时时间。从交易创建时间开始计算, 当面付场景默认值为3h
  516. // tradeCreateModel.setOpAppId();
  517. SignParams agreementSignParams = new SignParams();
  518. agreementSignParams.setSignScene("INDUSTRY|LIFE_PAYMENT"); // 场景码
  519. agreementSignParams.setProductCode("GENERAL_WITHHOLDING");
  520. /** 个人签约产品码,商户和支付宝签约时确定,有以下可选值:
  521. * - GENERAL_WITHHOLDING_P 商家代扣 ,没有限制,可以随时扣,不受场景码限制,同一个场景码同一个用户下可以无限签约
  522. * - CYCLE_PAY_AUTH_P 使用商家扣款产品时必传,其它支付产品无需传入 ,商家扣款受周期管控规则限制, 参数为:PeriodRuleParams, 一个场景码同一个用户签约只能使用一次,下次签约必须使用别的场景码
  523. * 商家扣款适用于续费会员类业务,商户代扣适用于滴滴打车免密支付类的
  524. */
  525. agreementSignParams.setPersonalProductCode("CYCLE_PAY_AUTH_P");
  526. agreementSignParams.setExternalAgreementNo(""); // 外部协议号
  527. // 签约通知地址
  528. agreementSignParams.setSignNotifyUrl("");
  529. // 周期类型PeriodType和周期数Period配合使用 如果 period_type = DAY, period = 7 ,就是每7天都可以扣一次
  530. PeriodRuleParams periodRuleParams = new PeriodRuleParams();
  531. periodRuleParams.setPeriodType("DAY"); // //周期类型枚举值为DAY和 MONTH
  532. periodRuleParams.setPeriod(7L);//周期数,最小值是7天
  533. //商户发起首次扣款的时间,格式:yyyy-MM-dd ,这个时间必须是在扣款时间的前5天内,比如您设置的execute_time是 1月10号,可以当天扣款,也可以提前五天,扣款时间是01月05号---01月10号,否则扣款时会提示:扣款日期不在签约时的允许范围之内
  534. periodRuleParams.setExecuteTime(DateUtil.getToday());
  535. periodRuleParams.setSingleAmount("0.01");//每次发起扣款时限制的最大金额单位为元
  536. periodRuleParams.setTotalAmount("0.02");//周期内允许扣款的总金额,单位为元
  537. // 总扣款次数, 可以扣款的期数 ,比如你设置了3 次,你想扣4次款。 那是不允许的,只能扣三次
  538. periodRuleParams.setTotalPayments(2L);
  539. agreementSignParams.setPeriodRuleParams(periodRuleParams);
  540. AccessParams accessParams = new AccessParams();
  541. accessParams.setChannel("ALIPAYAPP"); // 固定值
  542. agreementSignParams.setAccessParams(accessParams);
  543. tradeCreateModel.setAgreementSignParams(agreementSignParams);
  544. // JSONObject bizContent = new JSONObject();
  545. // bizContent.put("out_trade_no", "20210817010101003");
  546. // bizContent.put("total_amount", 0.01);
  547. // bizContent.put("subject", "测试商品");
  548. // bizContent.put("buyer_id", "2088102146225135");
  549. // bizContent.put("timeout_express", "10m");
  550. // bizContent.put("product_code", "JSAPI_PAY");
  551. //签约参数
  552. // JSONObject agreement_sign_params = new JSONObject();
  553. // agreement_sign_params.put("product_code", "GENERAL_WITHHOLDING");
  554. // agreement_sign_params.put("personal_product_code", "CYCLE_PAY_AUTH_P");
  555. // agreement_sign_params.put("sign_scene", "场景码xxxx");
  556. // agreement_sign_params.put("external_agreement_no", "外部协议号xxx");
  557. // agreement_sign_params.put("sign_notify_url", "异步通知地址xxx");
  558. //周期规则参数,必填
  559. // JSONObject period_rule_params = new JSONObject();
  560. // period_rule_params.put("period_type", "DAY");
  561. // period_rule_params.put("period", "7");
  562. // period_rule_params.put("execute_time", "2024-12-01");
  563. // period_rule_params.put("single_amount", "0.01");
  564. // period_rule_params.put("total_amount", "0.05");
  565. // period_rule_params.put("total_payments", "5");
  566. // agreement_sign_params.put("period_rule_params", period_rule_params);
  567. // JSONObject access_params = new JSONObject();
  568. // access_params.put("channel", "ALIPAYAPP");
  569. // agreement_sign_params.put("access_params", access_params);
  570. // bizContent.put("agreement_sign_params", agreement_sign_params);
  571. //// 商品明细信息,按需传入
  572. //JSONArray goodsDetail = new JSONArray();
  573. //JSONObject goods1 = new JSONObject();
  574. //goods1.put("goods_id", "goodsNo1");
  575. //goods1.put("goods_name", "子商品1");
  576. //goods1.put("quantity", 1);
  577. //goods1.put("price", 0.01);
  578. //goodsDetail.add(goods1);
  579. //bizContent.put("goods_detail", goodsDetail);
  580. //// 结算信息,按需传入
  581. //JSONObject settleInfo = new JSONObject();
  582. //JSONArray settleDetailInfos = new JSONArray();
  583. //JSONObject settleDetail = new JSONObject();
  584. //settleDetail.put("trans_in_type", "defaultSettle");
  585. //settleDetail.put("amount", 0.01);
  586. //settleDetailInfos.add(settleDetail);
  587. //settleInfo.put("settle_detail_infos", settleDetailInfos);
  588. //bizContent.put("settle_info", settleInfo);
  589. //// 二级商户信息,按需传入
  590. //JSONObject subMerchant = new JSONObject();
  591. //subMerchant.put("merchant_id", "2088000603999128");
  592. //bizContent.put("sub_merchant", subMerchant);
  593. //// 业务参数信息,按需传入
  594. //JSONObject businessParams = new JSONObject();
  595. //businessParams.put("busi_params_key", "busiParamsValue");
  596. //bizContent.put("business_params", businessParams);
  597. //// 营销信息,按需传入
  598. //JSONObject promoParams = new JSONObject();
  599. //promoParams.put("promo_params_key", "promoParamsValue");
  600. //bizContent.put("promo_params", promoParams);
  601. request.setBizModel(tradeCreateModel);
  602. AlipayTradeCreateResponse response = alipayClient.execute(request);
  603. if (response.isSuccess()) {
  604. System.out.println("调用成功");
  605. } else {
  606. System.out.println("调用失败");
  607. }
  608. return response;
  609. }
  610. /**
  611. * 验签方法
  612. * AlipaySignature.rsaCheckV1(params, alipaypublicKey, charset,"RSA2")
  613. *
  614. * 支付宝回调 通知规则: 如果商家反馈给支付宝的字符不是 success 这 7 个字符,支付宝服务器会不断重发通知,直到超过 24 小时 22 分钟。一般情况下,25 小时以内完成 8 次通知(通知的间隔频率一般是:4m、10m、1h、2h、6h、15h)。
  615. */
  616. }

AlipayShouYinTaiService

  1. package com;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alipay.api.AlipayApiException;
  4. import com.alipay.api.AlipayClient;
  5. import com.alipay.api.AlipayConfig;
  6. import com.alipay.api.DefaultAlipayClient;
  7. import com.alipay.api.domain.*;
  8. import com.alipay.api.request.*;
  9. import com.alipay.api.response.*;
  10. import java.io.UnsupportedEncodingException;
  11. import java.nio.charset.StandardCharsets;
  12. import java.util.Arrays;
  13. public class AlipayShouYinTaiService {
  14. // 应用私钥
  15. final static String privateKey = "";
  16. // 支付宝公钥,例如:MIIBIjANBg...
  17. final static String alipayPublicKey = "";
  18. // MD5密钥: (AES密钥
  19. final static String MD5 = "gDlNHJvnHuTjH06ba+f7sQ==";
  20. // 应用id
  21. public final static String appId = "";
  22. // 正式网关
  23. final static String alipayUrl = "https://openapi.alipay.com/gateway.do";
  24. // 场景码, 场景码请参阅: https://opendocs.alipay.com/open/20190319114403226822/signscene?pathHash=1e125353&ref=api
  25. // final static String SIGN_SCENE = "INDUSTRY|LIFE_PAYMENT";
  26. // final static String SIGN_SCENE = "INDUSTRY|VRPAY";
  27. private static AlipayConfig getAlipayConfig() {
  28. AlipayConfig alipayConfig = new AlipayConfig();
  29. alipayConfig.setServerUrl(alipayUrl);
  30. alipayConfig.setAppId(appId);
  31. alipayConfig.setPrivateKey(privateKey);
  32. alipayConfig.setFormat("json");
  33. alipayConfig.setAlipayPublicKey(alipayPublicKey);
  34. alipayConfig.setCharset("UTF-8");
  35. alipayConfig.setSignType("RSA2");
  36. return alipayConfig;
  37. }
  38. /**
  39. * 扣款之前给用户发送通知的,并且发送通知后只能根据这个接口返回的扣款需求去发起扣款
  40. * 调用的时候会发送一次,但是重复调用会有频率限制,每天上限是一个用户只会发送一次
  41. *
  42. *
  43. * alipay.user.agreement.permission.create(支付宝协议支付许可创建、服务变更接口)
  44. * https://opendocs.alipay.com/pre-open/03bqea?pathHash=caba6aee
  45. * @return
  46. * @throws AlipayApiException
  47. */
  48. public AlipayUserAgreementPermissionCreateResponse sendPayNotice(String agreementNo,String totalAmount,String outRequestNo) throws AlipayApiException {
  49. AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());
  50. AlipayUserAgreementPermissionCreateRequest request = new AlipayUserAgreementPermissionCreateRequest();
  51. AlipayUserAgreementPermissionCreateModel model = new AlipayUserAgreementPermissionCreateModel();
  52. model.setAgreementNo(agreementNo); // 签约的协议号
  53. model.setTotalAmount(totalAmount); // 总金额
  54. // 商户请求号。 由商家自定义,64个字符以内,仅支持字母、数字、下划线且需保证在商户端不重复。
  55. model.setOutRequestNo(outRequestNo);
  56. /**
  57. * 通知模版类型
  58. * 默认消息: DEFAULT_PERMISSION (NoticeTemplate不填默认就是 DEFAULT_PERMISSION)
  59. * 服务变更提醒 : SERVIOCE_NOTICE
  60. */
  61. // model.setNoticeTemplate("SERVIOCE_NOTICE");
  62. // // 业务参数,如果notice_template是SERVIOCE_NOTICE时,此参数必传
  63. // BusinessParamsMap businessParamsMap = new BusinessParamsMap();
  64. // businessParamsMap.setChangeTime("2024-11-25 22:22:22");
  65. // businessParamsMap.setOriAmount("0.01");
  66. // businessParamsMap.setNewAmount("0.02");
  67. // model.setBusinessParams(businessParamsMap);
  68. request.setBizModel(model);
  69. AlipayUserAgreementPermissionCreateResponse response = alipayClient.execute(request);
  70. if(response.isSuccess()){
  71. System.out.println("调用成功");
  72. } else {
  73. System.out.println("调用失败");
  74. }
  75. return response;
  76. }
  77. /**
  78. * 签约后发起支付接口(此过程由商户发起,用户无感知,也不需要进行操作,只会收到自动扣款的短信)
  79. * alipay.trade.pay(统一收单交易支付接口)
  80. * https://opendocs.alipay.com/apis/009zj1?scene=common
  81. * <p>
  82. * 发起支付不需要回调,扣款成功后,会 同步返回结果;
  83. */
  84. public AlipayTradePayResponse tradePay(String agreementNo, String outTradeNo,String amount) throws AlipayApiException {
  85. AlipayClient alipayClient = new DefaultAlipayClient(alipayUrl, appId, privateKey, "json", StandardCharsets.UTF_8.name(), alipayPublicKey, "RSA2");
  86. AlipayTradePayRequest request = new AlipayTradePayRequest();
  87. // request.setNotifyUrl("回调地址");
  88. AlipayTradePayModel model = new AlipayTradePayModel();
  89. model.setOutTradeNo(outTradeNo);
  90. model.setProductCode("GENERAL_WITHHOLDING");
  91. model.setTotalAmount(amount);
  92. model.setSubject("测试商品");
  93. // 添加fund_bill_list 表示返回资金明细信息
  94. model.setQueryOptions(Arrays.asList("fund_bill_list"));
  95. AgreementParams agreementParams = new AgreementParams();
  96. agreementParams.setAgreementNo(agreementNo);
  97. // 设置了预通知后,可在这里设置代扣扣款许可编码,将限制扣款金额和时间,相当于变成了 商家扣款模式
  98. // agreementParams.setDeductPermission("");
  99. model.setAgreementParams(agreementParams);
  100. request.setBizModel(model);
  101. AlipayTradePayResponse response = alipayClient.execute(request);
  102. return response;
  103. }
  104. }

pom.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>org.example</groupId>
  5. <artifactId>alibaba_getUserInfo</artifactId>
  6. <version>1.0-SNAPSHOT</version>
  7. <name>Archetype - alibaba_getUserInfo</name>
  8. <url>http://maven.apache.org</url>
  9. <dependencies>
  10. <dependency>
  11. <groupId>com.alipay.sdk</groupId>
  12. <artifactId>alipay-sdk-java</artifactId>
  13. <version>4.40.0.ALL</version>
  14. </dependency>
  15. <dependency>
  16. <groupId>junit</groupId>
  17. <artifactId>junit</artifactId>
  18. <version>4.12</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.apache.commons</groupId>
  22. <artifactId>commons-lang3</artifactId>
  23. <version>3.5</version>
  24. </dependency>
  25. <!-- 修改word文档-->
  26. <dependency>
  27. <groupId>com.alibaba</groupId>
  28. <artifactId>easyexcel</artifactId>
  29. <version>3.0.1</version>
  30. </dependency>
  31. <!--word转pdf-->
  32. <!-- <dependency>-->
  33. <!-- <groupId>fr.opensagres.xdocreport</groupId>-->
  34. <!-- <artifactId>fr.opensagres.poi.xwpf.converter.pdf-gae</artifactId>-->
  35. <!-- <version>2.0.1</version>-->
  36. <!-- </dependency>-->
  37. <dependency>
  38. <groupId>com.documents4j</groupId>
  39. <artifactId>documents4j-local</artifactId>
  40. <version>1.0.3</version>
  41. </dependency>
  42. <dependency>
  43. <groupId>com.documents4j</groupId>
  44. <artifactId>documents4j-transformer-msoffice-word</artifactId>
  45. <version>1.0.3</version>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.apache.poi</groupId>
  49. <artifactId>poi</artifactId>
  50. <version>5.2.3</version>
  51. </dependency>
  52. <dependency>
  53. <groupId>org.apache.poi</groupId>
  54. <artifactId>poi-ooxml</artifactId>
  55. <version>5.2.3</version>
  56. </dependency>
  57. <dependency>
  58. <groupId>com.deepoove</groupId>
  59. <artifactId>poi-tl</artifactId>
  60. <version>1.8.0</version>
  61. </dependency>
  62. <dependency>
  63. <groupId>com.luhuiguo</groupId>
  64. <artifactId>aspose-words</artifactId>
  65. <version>23.1</version>
  66. </dependency>
  67. <!-- 修改pdf内容-->
  68. <dependency>
  69. <groupId>org.apache.pdfbox</groupId>
  70. <artifactId>pdfbox</artifactId>
  71. <version>2.0.24</version>
  72. </dependency>
  73. <dependency>
  74. <groupId>org.projectlombok</groupId>
  75. <artifactId>lombok</artifactId>
  76. <version>1.18.2</version>
  77. <scope>provided</scope>
  78. </dependency>
  79. <dependency>
  80. <groupId>cn.hutool</groupId>
  81. <artifactId>hutool-all</artifactId>
  82. <version>4.4.5</version>
  83. </dependency>
  84. <dependency>
  85. <groupId>com.google.code.gson</groupId>
  86. <artifactId>gson</artifactId>
  87. <version>2.9.1</version>
  88. </dependency>
  89. </dependencies>
  90. </project>

Main

  1. package com;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alipay.api.AlipayApiException;
  4. import com.alipay.api.response.*;
  5. import com.util.DateUtil;
  6. import org.bouncycastle.math.Primes;
  7. import org.junit.Test;
  8. import java.io.UnsupportedEncodingException;
  9. import java.net.URLEncoder;
  10. import java.nio.charset.StandardCharsets;
  11. import java.util.Arrays;
  12. import java.util.Date;
  13. import java.util.List;
  14. import java.util.UUID;
  15. public class Main {
  16. public static void main(String[] args) throws AlipayApiException {
  17. String authCode = "c7b9e0939cf549a592e169d981ebFX29";
  18. AlipayService userInfoService = new AlipayService();
  19. // 获取accessToken
  20. AlipaySystemOauthTokenResponse accessToken = userInfoService.getAccessToken(authCode);
  21. System.out.println(JSON.toJSONString(accessToken));
  22. // 获取用户信息
  23. // String accessToken1 = accessToken.getAccessToken();
  24. // AlipayUserInfoShareResponse userInfo = userInfoService.getUserInfo(accessToken1);
  25. // System.out.println(JSON.toJSONString(userInfo));
  26. // 创建支付订单
  27. AlipayTradeCreateResponse tradeOrder = userInfoService.createTradeOrder(accessToken.getUserId());
  28. System.out.println(JSON.toJSONString(tradeOrder));
  29. }
  30. // 获取用户信息
  31. @Test
  32. public void getUserInfo() throws AlipayApiException {
  33. String authCode = "c8fe4984ff9f432b869e414553f3AX59";
  34. AlipayService userInfoService = new AlipayService();
  35. // 获取accessToken
  36. AlipaySystemOauthTokenResponse accessToken = userInfoService.getAccessToken(authCode);
  37. System.out.println(JSON.toJSONString(accessToken));
  38. // 获取用户信息
  39. String accessToken1 = accessToken.getAccessToken();
  40. AlipayUserInfoShareResponse userInfo = userInfoService.getUserInfo(accessToken1);
  41. System.out.println(JSON.toJSONString(userInfo));
  42. }
  43. // 创建支付订单号
  44. @Test
  45. public void getTradeOrder() throws AlipayApiException {
  46. String authCode = "6e7a267e39924afb933bc2c009d4KE29";
  47. AlipayService userInfoService = new AlipayService();
  48. // 获取accessToken
  49. AlipaySystemOauthTokenResponse accessToken = userInfoService.getAccessToken(authCode);
  50. System.out.println(JSON.toJSONString(accessToken));
  51. // 创建支付订单
  52. AlipayTradeCreateResponse tradeOrder = userInfoService.createTradeOrder(accessToken.getUserId());
  53. System.out.println(JSON.toJSONString(tradeOrder));
  54. }
  55. // 获取支付结果
  56. @Test
  57. public void getPayResultTest() throws AlipayApiException {
  58. AlipayService alipayService = new AlipayService();
  59. AlipayTradeQueryResponse payResult = alipayService.getPayResult("2024011622001418591452755643");
  60. System.out.println(JSON.toJSONString(payResult));
  61. /**
  62. * 支付成功案例:
  63. * {"body":"{\"alipay_trade_query_response\":{\"code\":\"10000\",\"msg\":\"Success\",\"buyer_logon_id\":\"135******23\",\"buyer_pay_amount\":\"0.01\",\"buyer_user_id\":\"2088612598194294\",\"fund_bill_list\":[{\"amount\":\"0.01\",\"fund_channel\":\"ALIPAYACCOUNT\"}],\"invoice_amount\":\"0.01\",\"out_trade_no\":\"109\",\"point_amount\":\"0.00\",\"receipt_amount\":\"0.01\",\"send_pay_date\":\"2024-01-05 14:57:05\",\"total_amount\":\"0.01\",\"trade_no\":\"2024010522001494291458453597\",\"trade_status\":\"TRADE_SUCCESS\"},\"sign\":\"F/g/crE8vQa3nfeoT6SzZqwzjkiIZ5gmuhzW8dS7KXohEQbztX0ORPtZSIF5OdJj+3tKrvp1jbT1Uv7L6ffad7yqKFPbyRD43wCukMlgSZWvOg6ySndfijEjUboR/O6Hq8Wg75cMnpq14cu4z9gwo9x7htNO3E7Oi5d5ecv/+bNYJzME8bvNJwPteFwdkwMoIkXwcZXyzuP9g1nddN2xnay7bKbGe4g5+GwIZ/xuwfNnr0HXSdNNKVJeAY9pDVpzsvutz+CR0GApHo8xmbsledSTTK9fKCDF1knFgTtLus0Ubt6LYlUzsEzzRQveWkQiozzOyIokL7vY1IuB1Tj1Mg==\"}","buyerLogonId":"135******23","buyerPayAmount":"0.01","buyerUserId":"2088612598194294","code":"10000","errorCode":"10000","fundBillList":[{"amount":"0.01","fundChannel":"ALIPAYACCOUNT"}],"invoiceAmount":"0.01","msg":"Success","outTradeNo":"109","params":{"biz_content":"{\"query_options\":[\"fund_bill_list\"],\"trade_no\":\"2024010522001494291458453597\"}"},"pointAmount":"0.00","receiptAmount":"0.01","sendPayDate":1704437825000,"success":true,"totalAmount":"0.01","tradeNo":"2024010522001494291458453597","tradeStatus":"TRADE_SUCCESS"}
  64. *
  65. * 支付失败案例:
  66. * 支付失败案例:
  67. */
  68. }
  69. // 签约- 获取签约字符串
  70. @Test
  71. public void getSignContactTest() throws AlipayApiException, UnsupportedEncodingException {
  72. AlipayService alipayService = new AlipayService();
  73. AlipayUserAgreementPageSignResponse signContact = alipayService.getSignContact("2024-01-05","108");
  74. System.out.println(JSON.toJSONString(signContact));
  75. System.out.println("body:"+signContact.getBody());
  76. System.out.println("encode:"+URLEncoder.encode(signContact.getBody(), "UTF-8"));
  77. }
  78. // 获取已签约信息 - 小程序
  79. @Test
  80. public void getExternalAgreementTest() throws AlipayApiException {
  81. // String authCode = "9c84c27ed1b84deb92c850b89efcHX29";
  82. AlipayService alipayService = new AlipayService();
  83. // 获取accessToken
  84. // AlipaySystemOauthTokenResponse accessToken = alipayService.getAccessToken(authCode);
  85. // System.out.println(JSON.toJSONString(accessToken));
  86. // 获取用户信息
  87. // AlipayUserInfoShareResponse userInfo = alipayService.getUserInfo(accessToken.getAccessToken());
  88. // AlipayUserAgreementQueryResponse response = alipayService.getExternalAgreement(userInfo.getUserId(), userInfo.getMobile());
  89. String externalAgreementNo = "20245901110399539448";
  90. AlipayUserAgreementQueryResponse response = alipayService.getExternalAgreement(externalAgreementNo);
  91. // 协议码:20236027100169580229
  92. System.out.println(JSON.toJSONString(response));
  93. /**
  94. * 成功案例
  95. * {"agreementNo":"20244910105584124229","alipayLogonId":"135******23","body":"{\"alipay_user_agreement_query_response\":{\"code\":\"10000\",\"msg\":\"Success\",\"agreement_no\":\"20244910105584124229\",\"alipay_logon_id\":\"135******23\",\"external_agreement_no\":\"108\",\"invalid_time\":\"2024-01-12 15:20:48\",\"next_deduct_time\":\"2024-01-05\",\"personal_product_code\":\"CYCLE_PAY_AUTH_P\",\"pricipal_type\":\"CARD\",\"principal_id\":\"2088612598194294\",\"sign_scene\":\"INDUSTRY|LIFE_PAYMENT\",\"sign_time\":\"2024-01-10 15:20:48\",\"status\":\"NORMAL\",\"third_party_type\":\"PARTNER\",\"valid_time\":\"2024-01-10 15:20:48\"},\"sign\":\"Fvmai2w7wXYyDi55yDXbBEfQnZIyrnH8+uPO1Rx6L5oFuyoCoY2RDUccQ8IYA05u/eaTUONVB3QhLvbjQdSwTkhbBVi7788BB60Gw6Nsoo14PsAwd6fcPIQCqW8em0K270aEjJYKW4vv0e4avsnVDXN1QVzqSiDezEW/iNpH262wu7MGKduakvipGmIeiMQkAJ9nGmIi/AKomyGkaEvHcs7pPcno+6LLyMvu1/fr0B0PWIFik2/428OzdzNwS9bZK6RyxXcxB0CiDiN/hMd/Ktw1sChfUYXgQSVIfYORo0Qrx6swF67H3OckefouwwMFqozuskA29z/IgEbTyCS7rA==\"}","code":"10000","errorCode":"10000","externalAgreementNo":"108","invalidTime":"2024-01-12 15:20:48","msg":"Success","nextDeductTime":"2024-01-05","params":{"biz_content":"{\"external_agreement_no\":\"108\",\"personal_product_code\":\"CYCLE_PAY_AUTH_P\",\"sign_scene\":\"INDUSTRY|LIFE_PAYMENT\"}"},"personalProductCode":"CYCLE_PAY_AUTH_P","pricipalType":"CARD","principalId":"2088612598194294","signScene":"INDUSTRY|LIFE_PAYMENT","signTime":"2024-01-10 15:20:48","status":"NORMAL","success":true,"thirdPartyType":"PARTNER","validTime":"2024-01-10 15:20:48"}
  96. *
  97. * 失败案例:
  98. * {"body":"{\"alipay_user_agreement_query_response\":{\"msg\":\"Business Failed\",\"code\":\"40004\",\"sub_msg\":\"用户协议不存在\",\"sub_code\":\"USER_AGREEMENT_NOT_EXIST\"},\"sign\":\"LTME03qoGLuk+A1LTpGUC49+f9s4ikUSDTIW8b24bQC6J/jzyPqZ2/VueGCw5sxwauuoI73bK5rhbcTbhpvYZfDQQny5hvhUpoVcHKZzHV0RJq3alYLYTvGbcrQ/ZahGknv9BoM+C48TEMz4Q7FQKjDVnbzD4Iog+48YFLZj+pI/RjR/cMkFmLPgpzTDA0fGW0dQitkYrwvXWOjm/xVLwd0UI5lySDU+P14gvStBou+98n6Hh+8cufq4Ct7SebVVNTm0hC+fgdSRdB7H6suWhK6LFS/Iu7W2rOI9xStUuN5fmbTDboEPvBQY0MmUQrE8INr2la+HCap6qEQTk+0OtA==\"}","code":"40004","errorCode":"40004","msg":"Business Failed","params":{"traceId":"21848e5617048705802475556ecb29","biz_content":"{\"external_agreement_no\":\"107\",\"personal_product_code\":\"CYCLE_PAY_AUTH_P\",\"sign_scene\":\"INDUSTRY|LIFE_PAYMENT\"}"},"subCode":"USER_AGREEMENT_NOT_EXIST","subMsg":"用户协议不存在","success":false}
  99. *
  100. * 已解约案例:
  101. *{"body":"{\"alipay_user_agreement_query_response\":{\"msg\":\"Business Failed\",\"code\":\"40004\",\"sub_msg\":\"用户协议不存在\",\"sub_code\":\"USER_AGREEMENT_NOT_EXIST\"},\"sign\":\"LTME03qoGLuk+A1LTpGUC49+f9s4ikUSDTIW8b24bQC6J/jzyPqZ2/VueGCw5sxwauuoI73bK5rhbcTbhpvYZfDQQny5hvhUpoVcHKZzHV0RJq3alYLYTvGbcrQ/ZahGknv9BoM+C48TEMz4Q7FQKjDVnbzD4Iog+48YFLZj+pI/RjR/cMkFmLPgpzTDA0fGW0dQitkYrwvXWOjm/xVLwd0UI5lySDU+P14gvStBou+98n6Hh+8cufq4Ct7SebVVNTm0hC+fgdSRdB7H6suWhK6LFS/Iu7W2rOI9xStUuN5fmbTDboEPvBQY0MmUQrE8INr2la+HCap6qEQTk+0OtA==\"}","code":"40004","errorCode":"40004","msg":"Business Failed","params":{"traceId":"0b26d8c617048848662741722e4873","biz_content":"{\"external_agreement_no\":\"108\",\"personal_product_code\":\"CYCLE_PAY_AUTH_P\",\"sign_scene\":\"INDUSTRY|LIFE_PAYMENT\"}"},"subCode":"USER_AGREEMENT_NOT_EXIST","subMsg":"用户协议不存在","success":false}
  102. */
  103. }
  104. // 获取已签约信息 - H5
  105. @Test
  106. public void getH5ExternalAgreementTest() throws AlipayApiException {
  107. AlipayH5Service alipayService = new AlipayH5Service();
  108. String str = "20241101001842386020021000028795\tINDUSTRY|LOTTERY";
  109. String[] lineList = str.split("\n");
  110. for (String item : lineList) {
  111. String[] info = item.split("\t");
  112. if(info.length != 2){
  113. System.out.println( "信息不对" +info[0] + ","+ info[1]);
  114. continue;
  115. }
  116. String externalAgreementNo = info[0];
  117. String signScene = info[1];
  118. AlipayUserAgreementQueryResponse response = alipayService.getExternalAgreement(externalAgreementNo,signScene);
  119. // 协议码:20236027100169580229
  120. // System.out.println(JSON.toJSONString(response));
  121. System.out.println("签约号:" +response.getAgreementNo() +", 失效时间:" +response.getInvalidTime());
  122. }
  123. /**
  124. * 成功案例
  125. * {"agreementNo":"20244910105584124229","alipayLogonId":"135******23","body":"{\"alipay_user_agreement_query_response\":{\"code\":\"10000\",\"msg\":\"Success\",\"agreement_no\":\"20244910105584124229\",\"alipay_logon_id\":\"135******23\",\"external_agreement_no\":\"108\",\"invalid_time\":\"2024-01-12 15:20:48\",\"next_deduct_time\":\"2024-01-05\",\"personal_product_code\":\"CYCLE_PAY_AUTH_P\",\"pricipal_type\":\"CARD\",\"principal_id\":\"2088612598194294\",\"sign_scene\":\"INDUSTRY|LIFE_PAYMENT\",\"sign_time\":\"2024-01-10 15:20:48\",\"status\":\"NORMAL\",\"third_party_type\":\"PARTNER\",\"valid_time\":\"2024-01-10 15:20:48\"},\"sign\":\"Fvmai2w7wXYyDi55yDXbBEfQnZIyrnH8+uPO1Rx6L5oFuyoCoY2RDUccQ8IYA05u/eaTUONVB3QhLvbjQdSwTkhbBVi7788BB60Gw6Nsoo14PsAwd6fcPIQCqW8em0K270aEjJYKW4vv0e4avsnVDXN1QVzqSiDezEW/iNpH262wu7MGKduakvipGmIeiMQkAJ9nGmIi/AKomyGkaEvHcs7pPcno+6LLyMvu1/fr0B0PWIFik2/428OzdzNwS9bZK6RyxXcxB0CiDiN/hMd/Ktw1sChfUYXgQSVIfYORo0Qrx6swF67H3OckefouwwMFqozuskA29z/IgEbTyCS7rA==\"}","code":"10000","errorCode":"10000","externalAgreementNo":"108","invalidTime":"2024-01-12 15:20:48","msg":"Success","nextDeductTime":"2024-01-05","params":{"biz_content":"{\"external_agreement_no\":\"108\",\"personal_product_code\":\"CYCLE_PAY_AUTH_P\",\"sign_scene\":\"INDUSTRY|LIFE_PAYMENT\"}"},"personalProductCode":"CYCLE_PAY_AUTH_P","pricipalType":"CARD","principalId":"2088612598194294","signScene":"INDUSTRY|LIFE_PAYMENT","signTime":"2024-01-10 15:20:48","status":"NORMAL","success":true,"thirdPartyType":"PARTNER","validTime":"2024-01-10 15:20:48"}
  126. *
  127. * 失败案例:
  128. * {"body":"{\"alipay_user_agreement_query_response\":{\"msg\":\"Business Failed\",\"code\":\"40004\",\"sub_msg\":\"用户协议不存在\",\"sub_code\":\"USER_AGREEMENT_NOT_EXIST\"},\"sign\":\"LTME03qoGLuk+A1LTpGUC49+f9s4ikUSDTIW8b24bQC6J/jzyPqZ2/VueGCw5sxwauuoI73bK5rhbcTbhpvYZfDQQny5hvhUpoVcHKZzHV0RJq3alYLYTvGbcrQ/ZahGknv9BoM+C48TEMz4Q7FQKjDVnbzD4Iog+48YFLZj+pI/RjR/cMkFmLPgpzTDA0fGW0dQitkYrwvXWOjm/xVLwd0UI5lySDU+P14gvStBou+98n6Hh+8cufq4Ct7SebVVNTm0hC+fgdSRdB7H6suWhK6LFS/Iu7W2rOI9xStUuN5fmbTDboEPvBQY0MmUQrE8INr2la+HCap6qEQTk+0OtA==\"}","code":"40004","errorCode":"40004","msg":"Business Failed","params":{"traceId":"21848e5617048705802475556ecb29","biz_content":"{\"external_agreement_no\":\"107\",\"personal_product_code\":\"CYCLE_PAY_AUTH_P\",\"sign_scene\":\"INDUSTRY|LIFE_PAYMENT\"}"},"subCode":"USER_AGREEMENT_NOT_EXIST","subMsg":"用户协议不存在","success":false}
  129. *
  130. * 已解约案例:
  131. *{"body":"{\"alipay_user_agreement_query_response\":{\"msg\":\"Business Failed\",\"code\":\"40004\",\"sub_msg\":\"用户协议不存在\",\"sub_code\":\"USER_AGREEMENT_NOT_EXIST\"},\"sign\":\"LTME03qoGLuk+A1LTpGUC49+f9s4ikUSDTIW8b24bQC6J/jzyPqZ2/VueGCw5sxwauuoI73bK5rhbcTbhpvYZfDQQny5hvhUpoVcHKZzHV0RJq3alYLYTvGbcrQ/ZahGknv9BoM+C48TEMz4Q7FQKjDVnbzD4Iog+48YFLZj+pI/RjR/cMkFmLPgpzTDA0fGW0dQitkYrwvXWOjm/xVLwd0UI5lySDU+P14gvStBou+98n6Hh+8cufq4Ct7SebVVNTm0hC+fgdSRdB7H6suWhK6LFS/Iu7W2rOI9xStUuN5fmbTDboEPvBQY0MmUQrE8INr2la+HCap6qEQTk+0OtA==\"}","code":"40004","errorCode":"40004","msg":"Business Failed","params":{"traceId":"0b26d8c617048848662741722e4873","biz_content":"{\"external_agreement_no\":\"108\",\"personal_product_code\":\"CYCLE_PAY_AUTH_P\",\"sign_scene\":\"INDUSTRY|LIFE_PAYMENT\"}"},"subCode":"USER_AGREEMENT_NOT_EXIST","subMsg":"用户协议不存在","success":false}
  132. */
  133. }
  134. // 签约后的发起支付 - 小程序
  135. @Test
  136. public void tradePayTest() throws AlipayApiException {
  137. AlipayService alipayService = new AlipayService();
  138. // 注意:多次扣款的 outTradeNo必须不一样
  139. AlipayTradePayResponse response = alipayService.tradePay("20244905103693650229","109");
  140. System.out.println(JSON.toJSONString(response));
  141. /**
  142. * 报错收集
  143. * 扣款日期不在签约时的允许范围之内: {"body":"{\"alipay_trade_pay_response\":{\"msg\":\"Business Failed\",\"code\":\"40004\",\"sub_msg\":\"扣款日期不在签约时的允许范围之内\",\"sub_code\":\"ACQ.CYCLE_PAY_DATE_NOT_MATCH\",\"receipt_amount\":\"0.00\",\"point_amount\":\"0.00\",\"buyer_pay_amount\":\"0.00\",\"invoice_amount\":\"0.00\"},\"sign\":\"e+h/yLtw5YIi3q4mf5J2UWgn7D9zWL88F+EMQtX921RBky3m3y4PIqKN4IEYXuQFU8GLE4lh/epyCxrx8DO95pU7nPnjd+jwijBUAoxVyrTDlodk5odREka98OyovlGR4RfpjXsY3rdiewogUfs1t1jx5oPH4pL/MNgqJFfBjOrQRGnOI6c14K+1OZXJ/lKThy6gfQTgjP0KT+1f6vdnu4wceVGujhO120s0QZUZVOylrjVDklJHGa1N2K5hfZWaP8qothleTOze1xqn5rxRO2IjGIatQJ4J3dKP1USi4B/W7WbZkaEFX38RR5wU2OJB7YN+w7drRaXRMxUfmcUOCg==\"}","buyerPayAmount":"0.00","code":"40004","errorCode":"40004","invoiceAmount":"0.00","msg":"Business Failed","params":{"traceId":"0b2282ed17041763682555176e435e","biz_content":"{\"out_trade_no\":\"12345678\",\"total_amount\":0.01,\"subject\":\"测试商品\",\"agreement_params\":{\"agreement_no\":\"20236028100530104229\"},\"product_code\":\"GENERAL_WITHHOLDING\"}"},"pointAmount":"0.00","receiptAmount":"0.00","subCode":"ACQ.CYCLE_PAY_DATE_NOT_MATCH","subMsg":"扣款日期不在签约时的允许范围之内","success":false}
  144. *
  145. * 成功响应
  146. * {"body":"{\"alipay_trade_pay_response\":{\"code\":\"10000\",\"msg\":\"Success\",\"buyer_logon_id\":\"135******23\",\"buyer_pay_amount\":\"0.00\",\"buyer_user_id\":\"2088612598194294\",\"gmt_payment\":\"2024-01-05 14:44:54\",\"invoice_amount\":\"0.00\",\"out_trade_no\":\"107\",\"point_amount\":\"0.00\",\"receipt_amount\":\"0.00\",\"total_amount\":\"0.01\",\"trade_no\":\"2024010522001494291455025704\"},\"sign\":\"Zlh9URi+uPF3MqDFs97Oi/9Spft+20hgqCChlGRnX7Xra3HEa1zLaGI0dda+XMEXn2MqANGUgb5D+OVrk8jOm9rDtZxAX4E8k7BSywNjW8ZMLuOQgCSZKRqFlC7OCdYoMdz5JyQR0pUv6V8F0a3CaI6jHq5toZdzoOoelK57gzcXi8njJIbdPASFRK6fJpv5pLQqbzOHlDlFoU1mcfMooBukYVB0MwZwMrLQHzhAYSPoDrwND0XRETjv/plp5N+TYzjfS06wA26JuXo/N+EZFe66OjWcZFHOwUOuGGYVeLGz85neoSdsBCBMiZhVapk9Vz4b0AnVdmQxiblaCN0XJg==\"}","buyerLogonId":"135******23","buyerPayAmount":"0.00","buyerUserId":"2088612598194294","code":"10000","errorCode":"10000","gmtPayment":1704437094000,"invoiceAmount":"0.00","msg":"Success","outTradeNo":"107","params":{"biz_content":"{\"out_trade_no\":\"107\",\"total_amount\":0.01,\"subject\":\"测试商品\",\"agreement_params\":{\"agreement_no\":\"20244905103712017229\"},\"product_code\":\"GENERAL_WITHHOLDING\"}"},"pointAmount":"0.00","receiptAmount":"0.00","success":true,"totalAmount":"0.01","tradeNo":"2024010522001494291455025704"}
  147. */
  148. }
  149. // 签约后的发起支付 - 直连支付宝 H5
  150. @Test
  151. public void tradePayH5Test() throws AlipayApiException {
  152. AlipayH5Service alipayService = new AlipayH5Service();
  153. String outTradeNo = UUID.randomUUID().toString();
  154. // 注意:多次扣款的 outTradeNo必须不一样
  155. AlipayTradePayResponse response = alipayService.tradePay("20245925090909270559",outTradeNo, "0.01");
  156. System.out.println(JSON.toJSONString(response));
  157. /**
  158. * 报错收集
  159. * 扣款日期不在签约时的允许范围之内: {"body":"{\"alipay_trade_pay_response\":{\"msg\":\"Business Failed\",\"code\":\"40004\",\"sub_msg\":\"扣款日期不在签约时的允许范围之内\",\"sub_code\":\"ACQ.CYCLE_PAY_DATE_NOT_MATCH\",\"receipt_amount\":\"0.00\",\"point_amount\":\"0.00\",\"buyer_pay_amount\":\"0.00\",\"invoice_amount\":\"0.00\"},\"sign\":\"e+h/yLtw5YIi3q4mf5J2UWgn7D9zWL88F+EMQtX921RBky3m3y4PIqKN4IEYXuQFU8GLE4lh/epyCxrx8DO95pU7nPnjd+jwijBUAoxVyrTDlodk5odREka98OyovlGR4RfpjXsY3rdiewogUfs1t1jx5oPH4pL/MNgqJFfBjOrQRGnOI6c14K+1OZXJ/lKThy6gfQTgjP0KT+1f6vdnu4wceVGujhO120s0QZUZVOylrjVDklJHGa1N2K5hfZWaP8qothleTOze1xqn5rxRO2IjGIatQJ4J3dKP1USi4B/W7WbZkaEFX38RR5wU2OJB7YN+w7drRaXRMxUfmcUOCg==\"}","buyerPayAmount":"0.00","code":"40004","errorCode":"40004","invoiceAmount":"0.00","msg":"Business Failed","params":{"traceId":"0b2282ed17041763682555176e435e","biz_content":"{\"out_trade_no\":\"12345678\",\"total_amount\":0.01,\"subject\":\"测试商品\",\"agreement_params\":{\"agreement_no\":\"20236028100530104229\"},\"product_code\":\"GENERAL_WITHHOLDING\"}"},"pointAmount":"0.00","receiptAmount":"0.00","subCode":"ACQ.CYCLE_PAY_DATE_NOT_MATCH","subMsg":"扣款日期不在签约时的允许范围之内","success":false}
  160. *
  161. * 成功响应
  162. * {"body":"{\"alipay_trade_pay_response\":{\"code\":\"10000\",\"msg\":\"Success\",\"buyer_logon_id\":\"135******23\",\"buyer_pay_amount\":\"0.00\",\"buyer_user_id\":\"2088612598194294\",\"gmt_payment\":\"2024-01-05 14:44:54\",\"invoice_amount\":\"0.00\",\"out_trade_no\":\"107\",\"point_amount\":\"0.00\",\"receipt_amount\":\"0.00\",\"total_amount\":\"0.01\",\"trade_no\":\"2024010522001494291455025704\"},\"sign\":\"Zlh9URi+uPF3MqDFs97Oi/9Spft+20hgqCChlGRnX7Xra3HEa1zLaGI0dda+XMEXn2MqANGUgb5D+OVrk8jOm9rDtZxAX4E8k7BSywNjW8ZMLuOQgCSZKRqFlC7OCdYoMdz5JyQR0pUv6V8F0a3CaI6jHq5toZdzoOoelK57gzcXi8njJIbdPASFRK6fJpv5pLQqbzOHlDlFoU1mcfMooBukYVB0MwZwMrLQHzhAYSPoDrwND0XRETjv/plp5N+TYzjfS06wA26JuXo/N+EZFe66OjWcZFHOwUOuGGYVeLGz85neoSdsBCBMiZhVapk9Vz4b0AnVdmQxiblaCN0XJg==\"}","buyerLogonId":"135******23","buyerPayAmount":"0.00","buyerUserId":"2088612598194294","code":"10000","errorCode":"10000","gmtPayment":1704437094000,"invoiceAmount":"0.00","msg":"Success","outTradeNo":"107","params":{"biz_content":"{\"out_trade_no\":\"107\",\"total_amount\":0.01,\"subject\":\"测试商品\",\"agreement_params\":{\"agreement_no\":\"20244905103712017229\"},\"product_code\":\"GENERAL_WITHHOLDING\"}"},"pointAmount":"0.00","receiptAmount":"0.00","success":true,"totalAmount":"0.01","tradeNo":"2024010522001494291455025704"}
  163. */
  164. }
  165. // 签约后的发起支付 - 收银台 - 直出支付宝
  166. @Test
  167. public void tradePaySYTTest() throws AlipayApiException {
  168. AlipayShouYinTaiService alipayService = new AlipayShouYinTaiService();
  169. String outTradeNo = UUID.randomUUID().toString();
  170. // 注意:多次扣款的 outTradeNo必须不一样
  171. AlipayTradePayResponse response = alipayService.tradePay("20245927107187260665",outTradeNo, "0.01");
  172. System.out.println(JSON.toJSONString(response));
  173. /**
  174. * 报错收集
  175. * 扣款日期不在签约时的允许范围之内: {"body":"{\"alipay_trade_pay_response\":{\"msg\":\"Business Failed\",\"code\":\"40004\",\"sub_msg\":\"扣款日期不在签约时的允许范围之内\",\"sub_code\":\"ACQ.CYCLE_PAY_DATE_NOT_MATCH\",\"receipt_amount\":\"0.00\",\"point_amount\":\"0.00\",\"buyer_pay_amount\":\"0.00\",\"invoice_amount\":\"0.00\"},\"sign\":\"e+h/yLtw5YIi3q4mf5J2UWgn7D9zWL88F+EMQtX921RBky3m3y4PIqKN4IEYXuQFU8GLE4lh/epyCxrx8DO95pU7nPnjd+jwijBUAoxVyrTDlodk5odREka98OyovlGR4RfpjXsY3rdiewogUfs1t1jx5oPH4pL/MNgqJFfBjOrQRGnOI6c14K+1OZXJ/lKThy6gfQTgjP0KT+1f6vdnu4wceVGujhO120s0QZUZVOylrjVDklJHGa1N2K5hfZWaP8qothleTOze1xqn5rxRO2IjGIatQJ4J3dKP1USi4B/W7WbZkaEFX38RR5wU2OJB7YN+w7drRaXRMxUfmcUOCg==\"}","buyerPayAmount":"0.00","code":"40004","errorCode":"40004","invoiceAmount":"0.00","msg":"Business Failed","params":{"traceId":"0b2282ed17041763682555176e435e","biz_content":"{\"out_trade_no\":\"12345678\",\"total_amount\":0.01,\"subject\":\"测试商品\",\"agreement_params\":{\"agreement_no\":\"20236028100530104229\"},\"product_code\":\"GENERAL_WITHHOLDING\"}"},"pointAmount":"0.00","receiptAmount":"0.00","subCode":"ACQ.CYCLE_PAY_DATE_NOT_MATCH","subMsg":"扣款日期不在签约时的允许范围之内","success":false}
  176. *
  177. * 成功响应
  178. * {"body":"{\"alipay_trade_pay_response\":{\"code\":\"10000\",\"msg\":\"Success\",\"buyer_logon_id\":\"135******23\",\"buyer_pay_amount\":\"0.00\",\"buyer_user_id\":\"2088612598194294\",\"gmt_payment\":\"2024-01-05 14:44:54\",\"invoice_amount\":\"0.00\",\"out_trade_no\":\"107\",\"point_amount\":\"0.00\",\"receipt_amount\":\"0.00\",\"total_amount\":\"0.01\",\"trade_no\":\"2024010522001494291455025704\"},\"sign\":\"Zlh9URi+uPF3MqDFs97Oi/9Spft+20hgqCChlGRnX7Xra3HEa1zLaGI0dda+XMEXn2MqANGUgb5D+OVrk8jOm9rDtZxAX4E8k7BSywNjW8ZMLuOQgCSZKRqFlC7OCdYoMdz5JyQR0pUv6V8F0a3CaI6jHq5toZdzoOoelK57gzcXi8njJIbdPASFRK6fJpv5pLQqbzOHlDlFoU1mcfMooBukYVB0MwZwMrLQHzhAYSPoDrwND0XRETjv/plp5N+TYzjfS06wA26JuXo/N+EZFe66OjWcZFHOwUOuGGYVeLGz85neoSdsBCBMiZhVapk9Vz4b0AnVdmQxiblaCN0XJg==\"}","buyerLogonId":"135******23","buyerPayAmount":"0.00","buyerUserId":"2088612598194294","code":"10000","errorCode":"10000","gmtPayment":1704437094000,"invoiceAmount":"0.00","msg":"Success","outTradeNo":"107","params":{"biz_content":"{\"out_trade_no\":\"107\",\"total_amount\":0.01,\"subject\":\"测试商品\",\"agreement_params\":{\"agreement_no\":\"20244905103712017229\"},\"product_code\":\"GENERAL_WITHHOLDING\"}"},"pointAmount":"0.00","receiptAmount":"0.00","success":true,"totalAmount":"0.01","tradeNo":"2024010522001494291455025704"}
  179. */
  180. }
  181. // 发起退款
  182. @Test
  183. public void refundTest() throws AlipayApiException {
  184. AlipayService alipayService = new AlipayService();
  185. // 订单号:
  186. // List<String> outerTradeNoList = Arrays.asList("");
  187. // for (String s : outerTradeNoList) {
  188. // AlipayTradeRefundResponse response = alipayService.refund(s, null,new Date().getTime() +"", "24.00");
  189. // System.out.println(JSON.toJSONString(response));
  190. // }
  191. List<String> tradeNoList = Arrays.asList("2024120322001481651456703862");
  192. for (String tradeNo : tradeNoList) {
  193. String outRequestNo = (new Date().getTime() + "") + tradeNo;
  194. AlipayTradeRefundResponse response = alipayService.refund(null, tradeNo,outRequestNo, "40");
  195. System.out.println(JSON.toJSONString(response));
  196. // fundChange == Y 表示退款成功
  197. if(response.isSuccess() && response.getFundChange().equals("Y")){
  198. System.out.println("退款成功");
  199. continue;
  200. }
  201. if(response.isSuccess() && response.getFundChange().equals("N")){
  202. // fundChange == N 时,需要查询 alipay.trade.fastpay.refund.query(统一收单交易退款查询) 来判断是否退款成功
  203. AlipayTradeFastpayRefundQueryResponse queryRefundInfo = alipayService.queryRefundInfo(response.getOutTradeNo(), outRequestNo);
  204. System.out.println(JSON.toJSONString(queryRefundInfo));
  205. // refundStatus == REFUND_SUCCESS 表示退款成功, 否则表示退款没有执行成功。
  206. if (queryRefundInfo.getRefundStatus().equals("REFUND_SUCCESS")) {
  207. System.out.println("退款成功");
  208. }
  209. }
  210. }
  211. /**
  212. * 成功示例
  213. * {"body":"{\"alipay_trade_refund_response\":{\"code\":\"10000\",\"msg\":\"Success\",\"buyer_logon_id\":\"135******23\",\"buyer_user_id\":\"2088612598194294\",\"fund_change\":\"Y\",\"gmt_refund_pay\":\"2024-01-05 14:53:20\",\"out_trade_no\":\"107\",\"refund_fee\":\"0.01\",\"send_back_fee\":\"0.00\",\"trade_no\":\"2024010522001494291455025704\"},\"sign\":\"RLoVYMO5fH4Q0OWb5s4luzluBq9VKtYauoleIeAgwJPqZCyhJP13H3jLfX3RFAna/8kvxA0Nh1fynwbrYHYR/lC5sK4LShg/2/VHIuEAium8uT8LFmqdusTCqZ9rfqeB54qqebJqtUE07TLDzm0R0l1iScx2NQHmEdzTCaO8/XMqeOn2wNLRfFoKd/dMmSk2u17VH2tPFw+dxQUtDMGhSKFC9yopBezwk3l4qPJh8VPI2QHBDf3TfHTfrQAWbbXS2p7cfqIYZDLzYeohvwcpTbrma56mTIRxnyLGe7mjdJ/lXg2UikOcg0gyQ/PvWO68woZGnTRJQf8KCxlHl57RyA==\"}","buyerLogonId":"135******23","buyerUserId":"2088612598194294","code":"10000","errorCode":"10000","fundChange":"Y","gmtRefundPay":1704437600000,"msg":"Success","outTradeNo":"107","params":{"biz_content":"{\"out_request_no\":\"107\",\"out_trade_no\":\"107\",\"refund_amount\":\"0.01\"}"},"refundFee":"0.01","sendBackFee":"0.00","success":true,"tradeNo":"2024010522001494291455025704"}
  214. */
  215. }
  216. // 查询退款信息
  217. @Test
  218. public void queryRefundInfoTest() throws AlipayApiException {
  219. AlipayService alipayService = new AlipayService();
  220. AlipayTradeFastpayRefundQueryResponse response = alipayService.queryRefundInfo("20240319150500370020007000134469", "3466789698954863616");
  221. System.out.println(JSON.toJSONString(response));
  222. if (response.getRefundStatus().equals("REFUND_SUCCESS")) {
  223. System.out.println("退款成功");
  224. }
  225. /**
  226. * 成功示例
  227. *{"body":"{\"alipay_trade_fastpay_refund_query_response\":{\"code\":\"10000\",\"msg\":\"Success\",\"out_request_no\":\"3466789698954863616\",\"out_trade_no\":\"20240319150500370020007000134469\",\"refund_amount\":\"24.00\",\"refund_status\":\"REFUND_SUCCESS\",\"total_amount\":\"24.00\",\"trade_no\":\"2024031922001481651401835463\"},\"sign\":\"W30fePUAMlYMrzn0jwk3/gE7vUaC4oQ8iYgy/94lC076ZTjqGuKIUaYvlEAPhH1k+GT0BOgW1Dg9bCxq47VNNLqbSXXcpmB54S25uUQvhJgg/U1Z+KLdMOR4WO4oGNpPG7cYzDizJZHC6qdMROjMuMYru+yfOSM6W+XA8mbTC2UjeHG7Q8jo8s81Ii2qBL0sV/DXlU2Sfsc2RflFz/T7ykIs65NOZhpBN7iKelHS/1EMgeLeP0S28vNIsglC6VWa/heoWFL6JOMZd8vjM0hDAg8VsiZ9ZN4vegvBjSb8C2GCmargP2WghVcl/l0KmQGbiAfkbHbw8G7K8m1bTxkhOA==\"}","code":"10000","msg":"Success","outRequestNo":"3466789698954863616","outTradeNo":"20240319150500370020007000134469","params":{"biz_content":"{\"out_request_no\":\"3466789698954863616\",\"out_trade_no\":\"20240319150500370020007000134469\"}"},"refundAmount":"24.00","refundStatus":"REFUND_SUCCESS","success":true,"totalAmount":"24.00","tradeNo":"2024031922001481651401835463"}
  228. */
  229. }
  230. // 延期扣款
  231. @Test
  232. public void updatePayTimeTest() throws AlipayApiException {
  233. AlipayService alipayService = new AlipayService();
  234. AlipayUserAgreementExecutionplanModifyResponse response = alipayService.updatePayTime("20244904103454420229", "2024-01-04");
  235. System.out.println(JSON.toJSONString(response));
  236. }
  237. // 解约
  238. @Test
  239. public void unsignTest() throws AlipayApiException {
  240. AlipayService alipayService = new AlipayService();
  241. AlipayUserAgreementUnsignResponse response = alipayService.unsign("20244905103693650229");
  242. System.out.println(JSON.toJSONString(response));
  243. }
  244. /**
  245. * 纯支付接口,获取tradeNo
  246. * @throws AlipayApiException
  247. */
  248. @Test
  249. public void tradeCreateTest() throws AlipayApiException {
  250. AlipayService alipayService = new AlipayService();
  251. // 20881006676481884062101352913329 是新国的用户id
  252. // 2088302334318591 是新东的用户id
  253. AlipayTradeCreateResponse response = alipayService.tradeCreate("102", "0.01", "2088302334318591");
  254. System.out.println(JSON.toJSONString(response));
  255. }
  256. // 签约并支付 - 小程序
  257. @Test
  258. public void signAndPayTest() throws AlipayApiException {
  259. AlipayService alipayService = new AlipayService();
  260. // 20881006676481884062101352913329 是新国的用户id
  261. // 2088302334318591 是新东的用户id
  262. AlipayTradeCreateResponse response = alipayService.signAndPay("1000","2088302334318591");
  263. System.out.println(JSON.toJSONString(response));
  264. }
  265. // // 签约并支 - pc版
  266. @Test
  267. public void signAndPayPcTest() throws AlipayApiException {
  268. AlipayH5Service alipayService = new AlipayH5Service();
  269. //
  270. String uuid = UUID.randomUUID().toString();
  271. AlipayTradePagePayResponse alipayTradePagePayResponse = alipayService.payAndSign(uuid, "0.01");
  272. System.out.println(JSON.toJSONString(alipayTradePagePayResponse));
  273. System.out.println(alipayTradePagePayResponse.getBody());
  274. }
  275. // // 签约并支付 - H5版
  276. @Test
  277. public void signAndPayH5Test() throws AlipayApiException, UnsupportedEncodingException {
  278. AlipayH5Service alipayService = new AlipayH5Service();
  279. //
  280. String outTradeNo = System.currentTimeMillis() + "";
  281. String signNo = System.currentTimeMillis() + "";
  282. String returnUrl = "uc://platform.usercenter.com/webext?min_version=523&url=https%3A%2F%2Fi-insurance-test.wanyol.com%2Finsurance%2Fproduct%2Fdetails%2FresultCommon%2F%3ForderNo%3D20241028164541670020006000015723%26accessSign%3Df8fc1b1cb2c6e99ec7f351aa7cf8b25b";
  283. AlipayTradePagePayResponse alipayTradePagePayResponse = alipayService.signAndPayH5(outTradeNo, signNo,"0.01",returnUrl);
  284. System.out.println(JSON.toJSONString(alipayTradePagePayResponse));
  285. System.out.println(alipayTradePagePayResponse.getBody());
  286. // 拼接跳转链接步骤
  287. // 1. 拼接跳转钱包SchemeUrl
  288. String alipayContent = "alipays://platformapi/startapp?appId=20000067&url=" +URLEncoder.encode(alipayTradePagePayResponse.getBody(),"UTF-8");
  289. System.out.println("alipayContent: " + alipayContent);
  290. // 2.接支付宝中转页地址
  291. String url = "https://render.alipay.com/p/c/mdeduct-landing?scheme=" + URLEncoder.encode(alipayContent,"UTF-8");
  292. System.out.println("url : " + url);
  293. }
  294. /**
  295. * 纯签约 - h5
  296. * @throws AlipayApiException
  297. * @throws UnsupportedEncodingException
  298. */
  299. @Test
  300. public void signH5Test() throws AlipayApiException, UnsupportedEncodingException {
  301. AlipayH5Service alipayService = new AlipayH5Service();
  302. String externalAgreementNo = UUID.randomUUID().toString();
  303. AlipayUserAgreementPageSignResponse signUrl = alipayService.getSignUrl("2024-10-08", externalAgreementNo);
  304. System.out.println(JSON.toJSONString(signUrl));
  305. }
  306. /**
  307. * h5纯支付
  308. * alipay.trade.wap.pay(手机网站支付接口2.0)
  309. * https://opendocs.alipay.com/open/29ae8cb6_alipay.trade.wap.pay?scene=21&pathHash=1ef587fd
  310. * @throws AlipayApiException
  311. */
  312. @Test
  313. public void h5OnlyPay() throws AlipayApiException, UnsupportedEncodingException {
  314. AlipayH5Service alipayService = new AlipayH5Service();
  315. // String returnUrl = null;
  316. String returnUrl = "uc://platform.usercenter.com/webext?min_version=523&url=https%3A%2F%2Fi-insurance-test.wanyol.com%2Finsurance%2Fproduct%2Fdetails%2FresultCommon%2F%3ForderNo%3D20241028164541670020006000015723%26accessSign%3Df8fc1b1cb2c6e99ec7f351aa7cf8b25b";
  317. // returnUrl = "https://i-insurance-test.wanyol.com/insurance/policy/undertakeResultPage/?returnUrl=" +URLEncoder.encode( returnUrl,"UTF-8");
  318. String id = UUID.randomUUID().toString();
  319. AlipayTradeWapPayResponse alipayTradeWapPayResponse = alipayService.h5OnlyPay(id, "0.01",returnUrl);
  320. String alipayContent = "alipays://platformapi/startapp?appId=20000067&url=" +URLEncoder.encode(alipayTradeWapPayResponse.getBody(),"UTF-8");
  321. System.out.println("alipayContent : "+alipayContent);
  322. // 2.接支付宝中转页地址
  323. String url = "https://render.alipay.com/p/c/mdeduct-landing?scheme=" + URLEncoder.encode(alipayContent,"UTF-8");
  324. System.out.println("h5 url : " + url);
  325. // System.out.println(JSON.toJSONString(alipayTradeWapPayResponse));
  326. }
  327. /**
  328. * 电脑网站纯支付(如果拉不起,可能是没开通,找客服解决)
  329. * @throws AlipayApiException
  330. * @throws UnsupportedEncodingException
  331. */
  332. @Test
  333. public void pcOnlyPay() throws AlipayApiException, UnsupportedEncodingException {
  334. AlipayH5Service alipayService = new AlipayH5Service();
  335. String id = UUID.randomUUID().toString();
  336. AlipayTradePagePayResponse response = alipayService.pcOnlyPay(id, "0.01");
  337. System.out.println("pc url : " + response.getBody()) ;
  338. // 拼接跳转链接步骤
  339. // 1. 拼接跳转钱包SchemeUrl
  340. String alipayContent = "alipays://platformapi/startapp?appId=20000067&url=" +URLEncoder.encode(response.getBody(),"UTF-8");
  341. System.out.println("alipayContent: " + alipayContent);
  342. // 2.接支付宝中转页地址
  343. String url = "https://render.alipay.com/p/c/mdeduct-landing?scheme=" + URLEncoder.encode(alipayContent,"UTF-8");
  344. System.out.println("url : " + url);
  345. }
  346. /**
  347. * 发送支付通知 - H5
  348. */
  349. @Test
  350. public void sendPayNoticeH5Test() throws AlipayApiException {
  351. AlipayH5Service alipayService = new AlipayH5Service();
  352. String id = UUID.randomUUID().toString();
  353. String agreementNo = "20245922105571177665";
  354. String amount = "0.01";
  355. AlipayUserAgreementPermissionCreateResponse response = alipayService.sendPayNotice(agreementNo,amount,id);
  356. System.out.println(JSON.toJSONString(response));
  357. System.out.println("商户代扣扣款许可: " + response.getDeductPermission());
  358. System.out.println("商户代扣扣款许可生效开始时间: " + response.getEffectiveTimeStart());
  359. System.out.println("商户代扣扣款许可生效结束时间: " + response.getEffectiveTimeEnd());
  360. /**
  361. * 响应示例:{"body":"{\"alipay_user_agreement_permission_create_response\":{\"code\":\"10000\",\"msg\":\"Success\",\"deduct_permission\":\"20241125003050020000590010816983\",\"effective_time_end\":\"20241128174531\",\"effective_time_start\":\"20241126174531\"},\"sign\":\"KVT5CqRAW++ZvexjgjoxC76E7DY/as13IqGzx3RJGVh+Synol0JSP2+jVn49QmrHRS3UevH2b8bImNMAWVgFqPJjZGem/xZp526YApyFjSrrPCztVeDDybsNISkwqcMZd+oJLBLvKBC2B8EwRQDrVk3kIaNraNsNxrDq1n43rJ3JR173VBLRu1Ea8SeVRhNxSuOXfdu0akjAEah8K/wHlaQF3WjS1WE0W+4LvWkvu3JGWvkmlN3nj9Q91dQ5Jgi12GTO2157OO0wc2sqfo2I3+y7pjP0IN50K8auJeRLPSYStlgYLGjKNu1cpzUdDWYaExMOGzZUMZVnmrPsentXYg==\"}","code":"10000","deductPermission":"20241125003050020000590010816983","effectiveTimeEnd":"20241128174531","effectiveTimeStart":"20241126174531","errorCode":"10000","msg":"Success","params":{"biz_content":"{\"agreement_no\":\"20245925090909270559\",\"out_request_no\":\"8bf3356d-fe82-43e5-a1d8-ac39c9ef9397\",\"total_amount\":\"0.01\"}"},"success":true}
  362. */
  363. }
  364. /**
  365. * 发送支付通知 - 收银台
  366. */
  367. @Test
  368. public void sendPayNoticeSYTTest() throws AlipayApiException {
  369. AlipayShouYinTaiService alipayService = new AlipayShouYinTaiService();
  370. String id = UUID.randomUUID().toString();
  371. String agreementNo = "20245927107187260665";
  372. String amount = "0.01";
  373. AlipayUserAgreementPermissionCreateResponse response = alipayService.sendPayNotice(agreementNo,amount,id);
  374. System.out.println(JSON.toJSONString(response));
  375. System.out.println("商户代扣扣款许可: " + response.getDeductPermission());
  376. System.out.println("商户代扣扣款许可生效开始时间: " + response.getEffectiveTimeStart());
  377. System.out.println("商户代扣扣款许可生效结束时间: " + response.getEffectiveTimeEnd());
  378. /**
  379. * 响应示例:{"body":"{\"alipay_user_agreement_permission_create_response\":{\"code\":\"10000\",\"msg\":\"Success\",\"deduct_permission\":\"20241125003050020000590010816983\",\"effective_time_end\":\"20241128174531\",\"effective_time_start\":\"20241126174531\"},\"sign\":\"KVT5CqRAW++ZvexjgjoxC76E7DY/as13IqGzx3RJGVh+Synol0JSP2+jVn49QmrHRS3UevH2b8bImNMAWVgFqPJjZGem/xZp526YApyFjSrrPCztVeDDybsNISkwqcMZd+oJLBLvKBC2B8EwRQDrVk3kIaNraNsNxrDq1n43rJ3JR173VBLRu1Ea8SeVRhNxSuOXfdu0akjAEah8K/wHlaQF3WjS1WE0W+4LvWkvu3JGWvkmlN3nj9Q91dQ5Jgi12GTO2157OO0wc2sqfo2I3+y7pjP0IN50K8auJeRLPSYStlgYLGjKNu1cpzUdDWYaExMOGzZUMZVnmrPsentXYg==\"}","code":"10000","deductPermission":"20241125003050020000590010816983","effectiveTimeEnd":"20241128174531","effectiveTimeStart":"20241126174531","errorCode":"10000","msg":"Success","params":{"biz_content":"{\"agreement_no\":\"20245925090909270559\",\"out_request_no\":\"8bf3356d-fe82-43e5-a1d8-ac39c9ef9397\",\"total_amount\":\"0.01\"}"},"success":true}
  380. */
  381. }
  382. }
  383. /**
  384. *
  385. * 十二月 26, 2023 3:29:16 下午 com.alipay.api.internal.util.AlipayLogger logBizSummary
  386. * 信息: Summary^_^null^_^null^_^ProtocalMustParams:charset=UTF-8&method=alipay.system.oauth.token&sign=Q4F7ouDOlR7OQ8RCDivNdu1kljR1vc1by1Gaw+fjqsBpoAPqY6xSFZ8ywZFnvdPAuqfqWqJmAkXU1oRMGSLAm0K9OK2giyPhSVSL3uvwaWh109OQQDACb2jYooTKodb3JrqK7KckCdC609m/I/ejSBMyWkFU7eFyFpe5Q8w1kRc4a2iRbQ5K4VNMDa1TRFilBNqaz35FilXbm5imBXXnzpS0wz9rzo4vD35RsEWNwgOlSvo2+NrKjE+XDqC2M1atFJCrutknGm461ZGeI7ofmj7mUHyYnJHGrelVMgo2P1mDa4o1QBxrykn7LVIXdRbORKqGYAeC2uboz4ssHCFbUg==&version=1.0&app_id=2021004128626292&sign_type=RSA2&timestamp=2023-12-26 15:29:14^_^ProtocalOptParams:alipay_sdk=alipay-sdk-java-4.38.161.ALL&format=json^_^ApplicationParams:grant_type=authorization_code&code=c7b9e0939cf549a592e169d981ebFX29^_^865ms,531ms,27ms^_^trace_id:2187fe6917035757560862467ecbd8
  387. * {"alipay_system_oauth_token_response":{"access_token":"authusrB0f61131ed2134243b14625de9dfb4B29","alipay_user_id":"20881006676481884062101352913329","auth_start":"2023-12-25 12:48:06","expires_in":1296000,"re_expires_in":2592000,"refresh_token":"authusrBf26aec2b126140a99c5e171ad26b9X29","user_id":"2088612598194294"},"sign":"Yqe0/IxtjAAAfgUpMXtWHj2cAjm4rhHOqYwe/3VgZ1er5yHA07ZB7Nfc/8KePOPn6mabG8CcbRePUkoV6vOplZiaZajLVjzWOzQMmMjDDofqMAtp1jvfmcApH3bLmu2Q/hTWT2ze39Db57b8MKM5ZeqCVb4fki9INnt/E7KKjuYohQOZY+ew8z+HrIIO5LunD0wp8ZJcVCGtDZ3wS481GX6Vxy9FQidwwTjy6yzj5SCk/eIJoyKBJfcRK+L6TIZeKWfoAO9cPbHb+1qyhs2b6YFLtkMHZkzfy5kD33UBUHa5OKYHLKt5ihdXrC3+TQgErAflKVZEdgAVdjrn+YUBpg=="}
  388. * 调用成功
  389. * {"accessToken":"authusrB0f61131ed2134243b14625de9dfb4B29","alipayUserId":"20881006676481884062101352913329","authStart":1703479686000,"body":"{\"alipay_system_oauth_token_response\":{\"access_token\":\"authusrB0f61131ed2134243b14625de9dfb4B29\",\"alipay_user_id\":\"20881006676481884062101352913329\",\"auth_start\":\"2023-12-25 12:48:06\",\"expires_in\":1296000,\"re_expires_in\":2592000,\"refresh_token\":\"authusrBf26aec2b126140a99c5e171ad26b9X29\",\"user_id\":\"2088612598194294\"},\"sign\":\"Yqe0/IxtjAAAfgUpMXtWHj2cAjm4rhHOqYwe/3VgZ1er5yHA07ZB7Nfc/8KePOPn6mabG8CcbRePUkoV6vOplZiaZajLVjzWOzQMmMjDDofqMAtp1jvfmcApH3bLmu2Q/hTWT2ze39Db57b8MKM5ZeqCVb4fki9INnt/E7KKjuYohQOZY+ew8z+HrIIO5LunD0wp8ZJcVCGtDZ3wS481GX6Vxy9FQidwwTjy6yzj5SCk/eIJoyKBJfcRK+L6TIZeKWfoAO9cPbHb+1qyhs2b6YFLtkMHZkzfy5kD33UBUHa5OKYHLKt5ihdXrC3+TQgErAflKVZEdgAVdjrn+YUBpg==\"}","expiresIn":"1296000","params":{"grant_type":"authorization_code","code":"c7b9e0939cf549a592e169d981ebFX29"},"reExpiresIn":"2592000","refreshToken":"authusrBf26aec2b126140a99c5e171ad26b9X29","success":true,"userId":"2088612598194294"}
  390. * 十二月 26, 2023 3:29:16 下午 com.alipay.api.internal.util.AlipayLogger logBizSummary
  391. * 信息: Summary^_^10000^_^null^_^ProtocalMustParams:charset=UTF-8&method=alipay.trade.create&sign=N5SmLpD+oJzujSodwNwc6ENURkzm2MJxQ5i/0aBS5kGLjBOBOsr8F4RaUb3RDJNTcBCjkfZBxBe4fABf875dxjrThTsU6IoHkIxih6WObC1FmzRM9Omyl8kj2+QdHNwHpxJvNG5S7+PM/vp70pjpU2un+atnvEh2g98KRMa4dv3+whVSkKcGm8WY+/40CHY4YkMpBWYs4uorABKW5qXic3sG7ZPt9vYg11Y2fP98iE7bkTKjwZ7gzU4vg1CwDuGn6PPRuLKPtxf6RogMYJQdQRe5FZZ+wmhRohN24vz4ckROCnEC2KUdbOmDCVqn/QaUmJHEMUSJu2G/1MAPIA7Now==&version=1.0&app_id=2021004128626292&sign_type=RSA2&timestamp=2023-12-26 15:29:16^_^ProtocalOptParams:alipay_sdk=alipay-sdk-java-4.38.161.ALL&format=json^_^ApplicationParams:biz_content={"out_trade_no":"123","total_amount":0.01,"subject":"test","buyer_id":"2088612598194294"}^_^6ms,242ms,6ms^_^trace_id:2187fe6917035757563122508ecbd8
  392. * trade_no: 2023122622001494291455985693
  393. * {"body":"{\"alipay_trade_create_response\":{\"code\":\"10000\",\"msg\":\"Success\",\"out_trade_no\":\"123\",\"trade_no\":\"2023122622001494291455985693\"},\"sign\":\"FXgfdl0ZtLQQElD7STE5zEPSi31PeFjP0sdt1k0OK7z28fp9Kf5IWj0N5sw9jWci6IJ6ngjgDNFM3Cyn2pyPSOhsV/IXTnWAQW/K42ualtfxUv6xxgMPE8c88/2EpFGPJkTxKwCYi6zjXAwepZAsuOtzUIn7XehwQJWBlFuVca7jELj3ZUtC1dU3vBbSapL+IJeiZXW2ubMpsOkvzP2fyU3k6Hsj6xUrrCBgjMTfFPb9Z3OhvURQitOBke5vvpMCiOmLtcvgyvdHescjs1ehrs39SBqBnKDpKJImnef3AG3pV+013F/9g/0ZtgCHQ9hcbGBtBqPVnxzc+AiyxN8oOQ==\"}","code":"10000","errorCode":"10000","msg":"Success","outTradeNo":"123","params":{"biz_content":"{\"out_trade_no\":\"123\",\"total_amount\":0.01,\"subject\":\"test\",\"buyer_id\":\"2088612598194294\"}"},"success":true,"tradeNo":"2023122622001494291455985693"}
  394. */

关键字Java

上一篇: git 使用 rebase 删除某次 提交

下一篇: 没有了