1、在支付宝开放平台下载当面付demo后,修改Alipay SDK版本为4.11.21.ALL或最新版(demo的3.3.0版本不支持证书方式)

<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.11.21.ALL</version>
</dependency>

2、导入bcprov-jdk*.jar包,否则会报错: java.lang.ClassNotFoundException: org.bouncycastle.jce.provider.BouncyCastleProvider

<dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk16</artifactId>
            <version>1.46</version>
        </dependency>

3、修改zfbinfo.properties (正式环境时,这三个证书应该单独存放在另一个文件夹,不要打包到jar)


# 支付宝网关名、partnerId和appId
open_api_domain = https://openapi.alipaydev.com/gateway.do
mcloud_api_domain = http://mcloudmonitor.com/gateway.do
#商户UID
pid = 20***913
appid = 2***565
# 应用私钥
private_key = MII****SkAgE
# 应用公钥证书 绝对地址
certPath = E:/****/CSR/appCertPublicKey_2021000117600565.crt# 支付宝根证书 绝对地址
rootCertPath = E:/****/CSR/alipayRootCert.crt#SHA256withRsa对应支付宝公钥证书   绝对地址
alipayPublicCertPath = E:/****/CSR/alipayCertPublicKey_RSA2.crt
# 签名类型: RSA->SHA1withRsa,RSA2->SHA256withRsa
sign_type = RSA2

4、编码

package com.alipay.demo.trade;import com.alipay.api.*;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.domain.TradeFundBill;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.alipay.api.response.MonitorHeartbeatSynResponse;
import com.alipay.demo.trade.config.Configs;
import com.alipay.demo.trade.model.ExtendParams;
import com.alipay.demo.trade.model.GoodsDetail;
import com.alipay.demo.trade.model.builder.*;
import com.alipay.demo.trade.model.hb.*;
import com.alipay.demo.trade.model.result.AlipayF2FPayResult;
import com.alipay.demo.trade.model.result.AlipayF2FPrecreateResult;
import com.alipay.demo.trade.model.result.AlipayF2FQueryResult;
import com.alipay.demo.trade.model.result.AlipayF2FRefundResult;
import com.alipay.demo.trade.service.AlipayMonitorService;
import com.alipay.demo.trade.service.AlipayTradeService;
import com.alipay.demo.trade.service.impl.AlipayMonitorServiceImpl;
import com.alipay.demo.trade.service.impl.AlipayTradeServiceImpl;
import com.alipay.demo.trade.service.impl.AlipayTradeWithHBServiceImpl;
import com.alipay.demo.trade.utils.Utils;
import com.alipay.demo.trade.utils.ZxingUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;import java.util.*;/*** Created by liuyangkly on 15/8/9.* 简单main函数,用于测试当面付api* sdk和demo的意见和问题反馈请联系:liuyang.kly@alipay.com*/
public class Main {private static Log                  log = LogFactory.getLog(Main.class);// 支付宝当面付2.0服务private static AlipayTradeService   tradeService;// 支付宝当面付2.0服务(集成了交易保障接口逻辑)private static AlipayTradeService   tradeWithHBService;// 支付宝交易保障接口服务,供测试接口api使用,请先阅读readme.txtprivate static AlipayMonitorService monitorService;private static final String certPath;private static final String rootCertPath;private static final String alipayPublicCertPath;static {/** 一定要在创建AlipayTradeService之前调用Configs.init()设置默认参数*  Configs会读取classpath下的zfbinfo.properties文件配置信息,如果找不到该文件则确认该文件是否在classpath目录*/Configs.init("zfbinfo.properties");ResourceBundle rb = ResourceBundle.getBundle("zfbinfo"); //没有.properties结尾certPath = rb.getString("certPath");rootCertPath = rb.getString("rootCertPath");alipayPublicCertPath = rb.getString("alipayPublicCertPath");}// 简单打印应答private void dumpResponse(AlipayResponse response) {if (response != null) {log.info(String.format("code:%s, msg:%s", response.getCode(), response.getMsg()));if (StringUtils.isNotEmpty(response.getSubCode())) {log.info(String.format("subCode:%s, subMsg:%s", response.getSubCode(),response.getSubMsg()));}log.info("body:" + response.getBody());}}public static void main(String[] args) throws AlipayApiException {Main main = new Main();// 测试当面付2.0生成支付二维码main.test_trade_precreate();}// 测试当面付2.0生成支付二维码public void test_trade_precreate() throws AlipayApiException {// (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,// 需保证商户系统端不能重复,建议通过数据库sequence生成,String outTradeNo = "tradeprecreate" + System.currentTimeMillis()+ (long) (Math.random() * 10000000L);// (必填) 订单标题,粗略描述用户的支付目的。如“xxx品牌xxx门店当面付扫码消费”String subject = "xxx品牌xxx门店当面付扫码消费";// (必填) 订单总金额,单位为元,不能超过1亿元// 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】String totalAmount = "100";// (可选) 订单不可打折金额,可以配合商家平台配置折扣活动,如果酒水不参与打折,则将对应金额填写至此字段// 如果该值未传入,但传入了【订单总金额】,【打折金额】,则该值默认为【订单总金额】-【打折金额】String undiscountableAmount = "0";// 卖家支付宝账号ID,用于支持一个签约账号下支持打款到不同的收款账号,(打款到sellerId对应的支付宝账号)// 如果该字段为空,则默认为与支付宝签约的商户的PID,也就是appid对应的PIDString sellerId = "208***913";// 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元"String body = "购买商品3件共20.00元";// 商户操作员编号,添加此参数可以为商户操作员做销售统计String operatorId = "test_operator_id";// (必填) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持String storeId = "test_store_id";// 业务扩展参数,目前可添加由支付宝分配的系统商编号(通过setSysServiceProviderId方法),详情请咨询支付宝技术支持ExtendParams extendParams = new ExtendParams();extendParams.setSysServiceProviderId("208***3913");// 支付超时,定义为30分钟String timeoutExpress = "30m";// 商品明细列表,需填写购买商品详细信息,List<GoodsDetail> goodsDetailList = new ArrayList<GoodsDetail>();// 创建一个商品信息,参数含义分别为商品id(使用国标)、名称、单价(单位为分)、数量,如果需要添加商品类别,详见GoodsDetailGoodsDetail goods1 = GoodsDetail.newInstance("goods_id001", "xxx小面包", 1000, 1);// 创建好一个商品后添加至商品明细列表goodsDetailList.add(goods1);// 继续创建并添加第一条商品信息,用户购买的产品为“黑人牙刷”,单价为5.00元,购买了两件GoodsDetail goods2 = GoodsDetail.newInstance("goods_id002", "xxx牙刷", 500, 2);goodsDetailList.add(goods2);// 创建扫码支付请求builder,设置请求参数AlipayTradePrecreateRequestBuilder builder = new AlipayTradePrecreateRequestBuilder().setSubject(subject).setTotalAmount(totalAmount).setOutTradeNo(outTradeNo).setUndiscountableAmount(undiscountableAmount).setSellerId(sellerId).setBody(body).setOperatorId(operatorId).setStoreId(storeId).setExtendParams(extendParams).setTimeoutExpress(timeoutExpress)
//                            .setNotifyUrl("http://www.baidu.com")//支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置.setGoodsDetailList(goodsDetailList);
//        AlipayF2FPrecreateResult result = tradeService.tradePrecreate(builder);CertAlipayRequest certAlipayRequest = new CertAlipayRequest();certAlipayRequest.setServerUrl(Configs.getOpenApiDomain());certAlipayRequest.setAppId(Configs.getAppid());certAlipayRequest.setPrivateKey(Configs.getPrivateKey());certAlipayRequest.setFormat("json");certAlipayRequest.setCharset("utf-8");certAlipayRequest.setSignType(Configs.getSignType());certAlipayRequest.setCertPath(certPath);certAlipayRequest.setAlipayPublicCertPath(alipayPublicCertPath);certAlipayRequest.setRootCertPath(rootCertPath);AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);//构造API请求AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
//        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();System.out.println(builder.toJsonString());System.out.println(builder.toString());request.setBizContent(builder.toJsonString()+"product_code:FACE_TO_FACE_PAYMENT");//发送请求AlipayTradePrecreateResponse response = alipayClient.certificateExecute(request);dumpResponse(response);// 需要修改为运行机器上的路径String filePath = String.format("C:/Users/***/Desktop/qr-%s.png",response.getOutTradeNo());log.info("filePath:" + filePath);
//        生成并输出支付二维码ZxingUtils.getQRCodeImge(response.getQrCode(), 256, filePath);boolean paid = false;// 轮询查询交易状态AlipayTradeQueryRequest tradeQueryRequest = new AlipayTradeQueryRequest();AlipayTradeQueryModel queryModel = new AlipayTradeQueryModel();queryModel.setOutTradeNo(outTradeNo);tradeQueryRequest.setBizModel(queryModel);for(int i=0; i<200; i++){// check every 3s, and 10 times in allSystem.out.println("now sleep 3s");try {Thread.sleep(3000);AlipayTradeQueryResponse tradeQueryResponse = test_trade_query(tradeQueryRequest);dumpResponse(tradeQueryResponse);System.out.println(i+1+"===>"+tradeQueryResponse.getTradeStatus());if ("TRADE_SUCCESS".equals(tradeQueryResponse.getTradeStatus())){paid = true;break;}} catch (InterruptedException e) {e.printStackTrace();}}if (paid){System.out.println("=========================交易成功=========================");}else {AlipayTradeCloseRequest tradeCloseRequest = new AlipayTradeCloseRequest();AlipayTradeCloseModel tradeCloseModel = new AlipayTradeCloseModel();tradeCloseModel.setOutTradeNo(outTradeNo);tradeCloseRequest.setBizModel(tradeCloseModel);AlipayTradeCloseResponse tradeCloseResponse = test_trade_close(tradeCloseRequest);if (tradeCloseResponse.isSuccess()){System.out.println("=========================交易关闭=========================");}else {dumpResponse(tradeCloseResponse);System.out.println("========================="+tradeCloseResponse.getSubMsg()+"=========================");}}}
}

不同支付方式,构造API请求和发送请求时需要调用不同的方法 

当面付(条码支付) AlipayTradePayRequest & AlipayTradePayResponse
当面付(线下扫码支付) AlipayTradePrecreateRequest&AlipayTradePrecreateResponse
当面付 AlipayTradeCreateRequest&AlipayTradeCreateResponse
APP支付 AlipayTradeAppPayRequest & AlipayTradeAppPayResponse
手机网页支付  AlipayTradeWapPayRequest& AlipayTradeWapPayResponse
电脑网页支付 AlipayTradePagePayRequest& AlipayTradePagePayResponse

Java:支付宝当面付demo(公钥证书方式)-沙箱环境测试版相关推荐

  1. Java支付宝当面付demo实例配置沙箱

    一.下载官方demo 下载地址:支付宝开放平台 下载Java版本的demo实例 二.使用idea导入项目 并将jar包加载到项目中 三.修改私钥公钥AppID和小程序id 还有在线引入Vue.js的地 ...

  2. 支付宝支付(2)之公钥证书方式

    上一篇介绍了最常用的普通公钥方式整合app支付宝支付,此篇主要介绍公钥证书方式,实际项目中因为业务的特殊性两种支付方式统一用同一套接口,根据不同参数对差异部分进行区分,这里为更清楚的介绍整合方法便提炼 ...

  3. java支付宝当面付接口_【图文】支付宝当面付配置教程

    能看到这个文档的,支付宝支付应该都有资格使用了吧!支付宝具备当面付没有资格的请申请支付宝当面付,也可找询问博主这只菜鸡咨询!可以代开哦! 支付宝当面付配置详细教程如下 新版支付宝接口改用了RSA2的密 ...

  4. java支付宝当面付接口_支付宝当面付秘钥生成教程(加对接案例)

    总是有小伙伴犯愁支付宝当面付的秘钥生成,看着挺高大上,实际上不是很麻烦,给大家分享一下生成过程,以及对接我们伟大的sspanel的方法 准备 开通了支付宝当面付的账号一枚(本人代开,50大洋,地址:联 ...

  5. Java 支付宝当面付生成二维码支付实现

    参考官方APIalipay.trade.precreate(统一收单线下交易预创建) maven依赖: <!-- 支付宝支付sdk --><dependency><gro ...

  6. 怎么开发支付宝扫码收款应用-java 支付宝当面付

    怎么开发支付宝扫码收款应用 说来也是很惭愧,之前计划好了每周写2~3篇的博客来记录,但是因为工作一忙(就是懒!)根本就没有时间来完成计划所以很久没有写了,希望之后可以每周一篇博客把,这篇主要就是记录一 ...

  7. java支付宝提现功能,单笔转账到支付宝账户(公钥证书方式)

    最近在开发商户分润系统(给商户分红),涉及到给商户账号提现功能,我们使用的是支付宝转账,通过公钥证书方式实现的. 在支付宝开放平台里找了好久的开发文档,但是介绍更多的是普通公钥的方式,这个方式比较简单 ...

  8. 支付宝支付+退款(公钥证书方式+普通公钥方式)app+java

    支付宝的签名方式有两种(普通公钥方式.公钥证书方式),一般最常用的就是普通公钥方式,也相对比较简单,但是公钥证书方式是现在支付宝支付官方文档上面推荐的签名方式. 申请步骤可以参照官方文档: 参考链接: ...

  9. java对接支付宝当面付

    文章目录 支付宝当面付(条码支付) 一.账号初始配置 1.身份选择 2.完善信息和拓展身份 2.1完善信息 2.2拓展身份 二.沙箱环境应用配置 1. 沙箱应用 1.1必看部分 1.2选看部分 2. ...

最新文章

  1. w3c的html4.0规范,W3C标准以及规范
  2. 刚构桥的优缺点_连续刚构桥相对于连续梁来说有优点吗
  3. 叮咚!您收到一份2021知位停车新品发布会暨合作伙伴大会邀请函
  4. 罗永浩“卖艺”还债能成?邀约不断,币圈抢着送钱
  5. 【转载】如何做个好员工?
  6. android meminfo,Android中dumpsys meminfo与/proc/meminfo获取空闲内存不一致的问题
  7. Windows 新建文本文档快捷键设置
  8. 微博黄V怎么认证:如何快速获得微博认证?
  9. EMC理论基础知识——电磁屏蔽
  10. memcmp比较结构体
  11. coffeescript html5,CoffeeScript函数
  12. Unity3D手游项目的总结和思考(6) - Xlua的使用心得
  13. 提高软件测试工作效率,资讯详情-软件测试提高工作效率的一些建议-柠檬班-自动化测试-软件测试培训-自学官网...
  14. Flink 的 算子链 和 资源组
  15. 第十三讲 面向对象(下)——Seasons in the sun
  16. 回溯法 n皇后 python 解法一
  17. 游戏开发者注意了,小心触犯任天堂的这些专利
  18. 1.16 使用JTAppleCalendar制作漂亮的日历 [iOS开发中的神兵利器]
  19. 解决 thymeleaf 中th 爆红
  20. 红黑树检索/插入/删除

热门文章

  1. 【破解利器】脱壳工具(软件扒皮工具)
  2. 【电脑运用及修理】Internet Explorer 浏览器
  3. python 等高线图标注_Pyplot等高线图-clabel间距
  4. 分享申请IDP账号的过程,包含duns申请的分享
  5. C语言程序设计入门08——初识格式化输出1:格式化输出PI值
  6. Java日期有效性验证
  7. 安全学习笔记(一):基础概念
  8. Selenium元素操作与属性值_Sinno_Song_新浪博客
  9. “黄金薄膜” CPI膜 —— 折叠屏手机核心材料
  10. 思考与总结【4】:好东西就是要分享