java对接支付宝小程序支付

        今天晚上12点部署生产项目,又是个不眠夜。

        之前整的好多东西都忘光了,还是记录下来吧。

        跟对接支付宝支付差不多,地址:小程序支付能力介绍 | 小程序

开通流程:

1.先要去支付宝开放平台,创建小程序。

2.拿到创建好的APPID。

3.需要开通相关能力,如果支付能力,签约能力等,管理 - > 能力管理页面

4.在开发设置拿到支付网关地址,设置公钥私钥,白名单信息等

5.使用支付宝开放平台开发助手,生成公钥私钥

6.接口内容,可加密可不加密都行,

7.下载服务端sdk地址:概述 | 网页&移动应用 我用的是通用版,把依赖放到pom里就可以了

8.根据 “统一收单交易创建接口” 接口写就行了

开发流程:

1、用户在小程序上点击 "充值" 按钮,调用后端服务接口,服务接口调用支付网关,
2、支付网关根据小程序的appid和支付宝公钥、小程序私钥调用支付宝java通用版SDK(小程序需要一个支付宝的uuid就是三方登录时获取的支付宝user_id),获取到tradeNo支付宝交易流水号,将流水号返给后台服务,然后后台服务返给小程序,
3、小程序根据流水号去唤起支付宝收银台,完成请求操作后,
4、支付宝服务端会异步通知支付网关,然后支付网关通知服务后台是否支付成功了,
5、然后做自己的业务逻辑处理,更新表呀,发送通知呀等操作

SDK部分代码:

请求:

AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key","RSA2");
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
request.setNotifyUrl("");
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", "20210817010101003");
bizContent.put("total_amount", 0.01);
bizContent.put("subject", "测试商品");
bizContent.put("buyer_id", "2088102146225135");
bizContent.put("timeout_express", "10m");

 商品明细信息,按需传入
//JSONArray goodsDetail = new JSONArray();
//JSONObject goods1 = new JSONObject();
//goods1.put("goods_id", "goodsNo1");
//goods1.put("goods_name", "子商品1");
//goods1.put("quantity", 1);
//goods1.put("price", 0.01);
//goodsDetail.add(goods1);
//bizContent.put("goods_detail", goodsDetail);

 扩展信息,按需传入
//JSONObject extendParams = new JSONObject();
//extendParams.put("sys_service_provider_id", "2088511833207846");
//bizContent.put("extend_params", extendParams);

 结算信息,按需传入
//JSONObject settleInfo = new JSONObject();
//JSONArray settleDetailInfos = new JSONArray();
//JSONObject settleDetail = new JSONObject();
//settleDetail.put("trans_in_type", "defaultSettle");
//settleDetail.put("amount", 0.01);
//settleDetailInfos.add(settleDetail);
//settleInfo.put("settle_detail_infos", settleDetailInfos);
//bizContent.put("settle_info", settleInfo);

 二级商户信息,按需传入
//JSONObject subMerchant = new JSONObject();
//subMerchant.put("merchant_id", "2088000603999128");
//bizContent.put("sub_merchant", subMerchant);

 业务参数信息,按需传入
//JSONObject businessParams = new JSONObject();
//businessParams.put("busi_params_key", "busiParamsValue");
//bizContent.put("business_params", businessParams);

 营销信息,按需传入
//JSONObject promoParams = new JSONObject();
//promoParams.put("promo_params_key", "promoParamsValue");
//bizContent.put("promo_params", promoParams);

request.setBizContent(bizContent.toString());
AlipayTradeCreateResponse response = alipayClient.execute(request);
if(response.isSuccess()){
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}

响应:

{
    "alipay_trade_create_response": {
        "code": "10000",
        "msg": "Success",
        "out_trade_no": "20150423001001",
        "trade_no": "2015042321001004720200028594"
    },
    "sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE"
}

这里说一下支付宝和支付宝小程序的区别,支付宝是将会话id返给前端,小程序是将tradeNo交易流水号返给前端,在有就是支付宝小程序需要一个用户自己的uuid(三方登录时获取的支付宝user_id),其他基本一样。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Java对接微信小程序支付,你需要完成以下步骤: 1. 获取微信支付的 API 密钥和商户号,以及小程序 appID 和 appSecret。 2. 在小程序开发者工具中创建支付统一下单接口,并记录好接口地址。 3. 在 Java 中编写代码,向微信支付下单接口发送请求,并获取返回的 prepay_id。 4. 将 prepay_id 和其他参数按照微信支付要求的格式进行签名,并返回给前端。 5. 前端通过微信小程序支付 API 调起支付界面,用户完成支付后,微信服务器会向商户服务器发送支付结果通知。 6. 商户服务器接收到支付结果通知后,需要进行签名验证和订单处理。 以下是一份示例代码,可以帮助你完成微信小程序支付对接: ```java import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.HashMap; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; public class WechatPayment { private String appid; // 小程序 ID private String mch_id; // 商户号 private String key; // API 密钥 public WechatPayment(String appid, String mch_id, String key) { this.appid = appid; this.mch_id = mch_id; this.key = key; } public Map<String, String> unifiedorder(String body, String out_trade_no, int total_fee, String spbill_create_ip, String notify_url) throws Exception { SortedMap<String, String> params = new TreeMap<String, String>(); params.put("appid", appid); params.put("mch_id", mch_id); params.put("nonce_str", getRandomString(32)); params.put("body", body); params.put("out_trade_no", out_trade_no); params.put("total_fee", String.valueOf(total_fee)); params.put("spbill_create_ip", spbill_create_ip); params.put("notify_url", notify_url); params.put("trade_type", "JSAPI"); params.put("openid", "用户的 openid"); String sign = createSign(params); params.put("sign", sign); String xml = mapToXml(params); String responseXml = HttpUtils.post("https://api.mch.weixin.qq.com/pay/unifiedorder", xml); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new ByteArrayInputStream(responseXml.getBytes())); Element rootElement = document.getDocumentElement(); String return_code = getElementValue(rootElement, "return_code"); String result_code = getElementValue(rootElement, "result_code"); String prepay_id = getElementValue(rootElement, "prepay_id"); if ("SUCCESS".equals(return_code) && "SUCCESS".equals(result_code) && prepay_id != null) { Map<String, String> result = new HashMap<String, String>(); result.put("prepay_id", prepay_id); String nonce_str = getRandomString(32); result.put("nonceStr", nonce_str); result.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); result.put("signType", "MD5"); result.put("package", "prepay_id=" + prepay_id); sign = createSign(result); result.put("paySign", sign); return result; } else { throw new Exception(getElementValue(rootElement, "return_msg")); } } private String createSign(Map<String, String> params) throws NoSuchAlgorithmException { StringBuilder sb = new StringBuilder(); for (Map.Entry<String, String> entry : params.entrySet()) { if (entry.getValue() != null && entry.getValue().length() > 0 && !"sign".equals(entry.getKey()) && !"key".equals(entry.getKey())) { sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } } sb.append("key=").append(key); MessageDigest md = MessageDigest.getInstance("MD5"); md.update(sb.toString().getBytes()); byte[] digest = md.digest(); StringBuilder signBuilder = new StringBuilder(); for (byte b : digest) { String hex = Integer.toHexString(b & 0xff); if (hex.length() == 1) { signBuilder.append("0"); } signBuilder.append(hex); } return signBuilder.toString().toUpperCase(); } private String mapToXml(Map<String, String> params) { StringBuilder sb = new StringBuilder(); sb.append("<xml>"); for (Map.Entry<String, String> entry : params.entrySet()) { sb.append("<").append(entry.getKey()).append(">"); sb.append(entry.getValue()); sb.append("</").append(entry.getKey()).append(">"); } sb.append("</xml>"); return sb.toString(); } private String getElementValue(Element element, String tagName) { Element childElement = (Element) element.getElementsByTagName(tagName).item(0); if (childElement != null) { return childElement.getTextContent(); } return null; } private String getRandomString(int length) { String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; StringBuilder sb = new StringBuilder(); for (int i = 0; i < length; i++) { sb.append(str.charAt((int) (Math.random() * str.length()))); } return sb.toString(); } } ``` 其中,HttpUtils.post() 方法用于发送 HTTP POST 请求,你需要自己实现。在 unifiedorder() 方法中,我们按照微信支付要求的格式构造请求参数,并对参数进行签名。然后向微信支付下单接口发送请求,获取 prepay_id。最后,我们将 prepay_id 和其他参数按照微信支付要求的格式进行签名,并返回给前端。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值