第一步:生成预付单二维码
- 支付宝商户号创建应用
- 项目导入阿里支付jar包
- alipay-sdk-java20161213173952.jar
- alipay-sdk-java20161213173952-source.jar
- alipay-trade-sdk.jar
- alipay-trade-sdk-20161215.jar
- alipay-trade-sdk-20161215-source.jar
- 下面代码返回的是二维码的url
public static String test_trade_precreate(Double Total, int Num, String Goods, String outTradeNo) {
// (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,
// 需保证商户系统端不能重复,建议通过数据库sequence生成,
// String outTradeNo = "tradeprecreate" + System.currentTimeMillis()+ (long) (Math.random() * 10000000L);
// (必填) 订单标题,粗略描述用户的支付目的。如“xxx品牌xxx门店当面付扫码消费”
String subject = "****-****";
// (必填) 订单总金额,单位为元,不能超过1亿元
// 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】
String totalAmount = String.valueOf(Total);
// (可选) 订单不可打折金额,可以配合商家平台配置折扣活动,如果酒水不参与打折,则将对应金额填写至此字段
// 如果该值未传入,但传入了【订单总金额】,【打折金额】,则该值默认为【订单总金额】-【打折金额】
String undiscountableAmount = "0";
// 卖家支付宝账号ID,用于支持一个签约账号下支持打款到不同的收款账号,(打款到sellerId对应的支付宝账号)
// 如果该字段为空,则默认为与支付宝签约的商户的PID,也就是appid对应的PID
String sellerId = "";
// 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元"
String body = "购买商品" + Num + "件共" + Total + "元";
// 商户操作员编号,添加此参数可以为商户操作员做销售统计
//String operatorId = "test_operator_id";
// (必填) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持
String storeId = "test_store_id";
// 业务扩展参数,目前可添加由支付宝分配的系统商编号(通过setSysServiceProviderId方法),详情请咨询支付宝技术支持
//ExtendParams extendParams = new ExtendParams();
//extendParams.setSysServiceProviderId("2088100200300400500");
// 支付超时,定义为120分钟
String timeoutExpress = "120m";
// 商品明细列表,需填写购买商品详细信息,
List<GoodsDetail> goodsDetailList = new ArrayList<>();
// 创建一个商品信息,参数含义分别为商品id(使用国标)、名称、单价(单位为分)、数量,如果需要添加商品类别,详见GoodsDetail
//GoodsDetail goods1 = GoodsDetail.newInstance("goods_id001", "xxx小面包", 1000, 1);
// 创建好一个商品后添加至商品明细列表
//goodsDetailList.add(goods1);
String[] arg = Goods.split("\\*");
for (String s : arg) {
System.out.println(s);
String[] orz = s.split("_");
Double to = Double.parseDouble(orz[2]);
//Long total = (long) (to * 100);
BigDecimal bignum1 = new BigDecimal(String.valueOf(to));
BigDecimal bignum2 = new BigDecimal("100");
BigDecimal bignum3 = bignum1.multiply(bignum2); //乘法运算
long total = bignum3.longValue();
GoodsDetail goodssuz = GoodsDetail.newInstance(orz[0], orz[1], total, Integer.parseInt(orz[3]));
goodsDetailList.add(goodssuz);
System.out.println("商品列表:" + goodsDetailList);
}
// 继续创建并添加第一条商品信息,用户购买的产品为“黑人牙刷”,单价为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)
.setStoreId(storeId)
.setTimeoutExpress(timeoutExpress)
// .setNotifyUrl("http://www.test-notify-url.com")//支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置
.setGoodsDetailList(goodsDetailList);
AlipayF2FPrecreateResult result = tradeService.tradePrecreate(builder);
String code = "";
switch (result.getTradeStatus()) {
case SUCCESS:
log.info("支付宝预下单成功: )");
AlipayTradePrecreateResponse response = result.getResponse();
dumpResponse(response);
System.out.println("二维码:" + response.getQrCode());
code = response.getQrCode();
// 需要修改为运行机器上的路径
String filePath = String.format("/Users/sudo/Desktop/qr-%s.png",
response.getOutTradeNo());
log.info("filePath:" + filePath);
// ZxingUtils.getQRCodeImge(response.getQrCode(), 256, filePath);
break;
case FAILED:
log.error("支付宝预下单失败!!!");
break;
case UNKNOWN:
log.error("系统异常,预下单状态未知!!!");
break;
default:
log.error("不支持的交易状态,交易返回异常!!!");
break;
}
return code;
}
第二步:轮询支付结果
- 根据订单编号调用支付宝查询支付结果的接口
- 以下代码返回支付结果
public static String test_trade_query(String outTradeNo) {
// (必填) 商户订单号,通过此商户订单号查询当面付的交易状态
String Type;
// 创建查询请求builder,设置请求参数
AlipayTradeQueryRequestBuilder builder = new AlipayTradeQueryRequestBuilder()
.setOutTradeNo(outTradeNo);
System.out.println("请求参数:" + builder);
AlipayF2FQueryResult result = tradeService.queryTradeResult(builder);
switch (result.getTradeStatus()) {
case SUCCESS:
log.info("查询返回该订单支付成功: )");
Type = "SUCCESS";
AlipayTradeQueryResponse response = result.getResponse();
dumpResponse(response);
log.info(response.getTradeStatus());
if (Utils.isListNotEmpty(response.getFundBillList())) {
for (TradeFundBill bill : response.getFundBillList()) {
log.info(bill.getFundChannel() + ":" + bill.getAmount());
}
}
break;
case FAILED:
log.error("查询返回该订单支付失败或被关闭!!!");
Type = "FAILED";
break;
case UNKNOWN:
log.error("系统异常,订单支付状态未知!!!");
Type = "UNKNOWN";
break;
default:
log.error("不支持的交易状态,交易返回异常!!!");
Type = "default";
break;
}
return Type;
}