首先如标题,本文章详细讲解支付宝当面付的下单(alipay.trade.precreate),基于原生java,不依赖官方SDK,虽然官方sdk包可能功能比较全,但是往往你用不到里面所有的功能,且不好理解里面的代码(也没时间细看),不如通过自己亲自手写,按需实现各个接口的功能。

先看下官方扫码支付api列表支付宝开放平台文档

支付宝开放平台支付接口(手把手教你接入支付宝支付)(1)

打开alipay.trade.precreate(统一收单线下交易预创建),通常第三方api接口参数分为公共参数和请求参数,公共参数的申请和获取这里就不作详解,如不懂获取的可以评论留言。我会给大家一一解答。

开发前先读一遍文档,熟悉哪些参数必输,了解下参数的格式等,下面进入正题。

1、组装公共参数

Map<String, String> commonMap = this.initCommon("alipay.trade.precreate", callBack onlineOrder.getChannelId());

private Map<String, String> initCommon(String method, String notifyUrl) { Map<String, String> commonMap = new HashMap<>(16); commonMap.put("app_id", "201610250*******"); commonMap.put("method", method); commonMap.put("charset", "utf-8"); commonMap.put("sign_type", "rsa2"); // yyyy-MM-dd HH:mm:ss commonMap.put("timestamp", DateUtils.formatByDateTimePattern()); commonMap.put("version", "1.0"); // 接收异步通知的地址 commonMap.put("notify_url", notifyUrl); return commonMap; }

appId这里打了马赛克,method就是你需要执行的支付宝接口方法,charset字符编码,sign_type签名方式,timestamp时间戳,version版本号,notify_url异步通知地址(没有的话可以不传)。

2、biz_content内容参数组织

Map<String, String> bizContent = new HashMap<>(16); bizContent.put("out_trade_no", onlineOrder.getId()); bizContent.put("total_amount", onlineOrder.getAmount()); bizContent.put("subject", onlineOrder.getGoodsName()); bizContent.put("body", onlineOrder.getGoodsName());

之后我们将biz_content内容添加到公共参数的map中

commonMap.put("biz_content", JSON.toJSONString(bizContent));

3、排序拼接参数为之后的签名做准备

String paramStr = StringUtils.alipaySortParam(commonMap);

public static String alipaySortParam(Map<String, String> paraMap) { List<Map.Entry<String, String>> list = new ArrayList<>(paraMap.entrySet()); list.sort(Comparator.comparing(o -> (o.getKey()))); StringBuilder buf = new StringBuilder(); int i = list.size(); int j = 1; for (Map.Entry<String, String> item : list) { if (StringUtils.isNotBlank(item.getValue())) { buf.append(item.getKey()).append("=").append(item.getValue()); if (i != j) { buf.append("&"); } } j ; } return buf.toString(); }

4、接下来rsa签名

commonMap.put("sign", RsaUtils.sign(privateKey, paramStr));

public static String sign(String key, String requestData) { String signature = null; byte[] signed = null; try { PrivateKey privateKey = getPrivateKey(key); Signature Sign = Signature.getInstance(SIGNATURE_ALGORITHM); Sign.initSign(privateKey); Sign.update(requestData.getBytes()); signed = Sign.sign(); signature = Base64.getEncoder().encodeToString(signed); } catch (Exception e) { log.error("Exception", e); } return signature; }

将签名参数添加到公共参数commonMap中,接下来就可以请求支付宝网关地址发送请求罗。

5、发送http请求

String result = OkHttp.doPost(gatewayUrl, commonMap);

这里我使用okhttp工具类发送,需要这个工具类的可以私信。

顺便上一个支付成功的截图(如下)

支付宝开放平台支付接口(手把手教你接入支付宝支付)(2)

如果给你带来帮助,请帮忙转发留言吧,闲时分享心得。

,