如何用java對接微信小程序下單后的發(fā)貨接口
配置參數(shù)
首先需要獲取Access_token,調用前,需要到微信小程序平臺-準備好小程序的appid 和 密鑰secret這兩個參數(shù)。
調用代碼
獲取Access_token
import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; /** * @author Alcedo * @date 2024/12/08 * @apiNote */ @Slf4j public class AccessTokenUtil { /** * 獲取accessToken * @param appid 小程序appid * @param secret 小程序secret * @return */ public static String getAccessToken(String appid, String secret) { log.info("initAccessToken:開始運行..."); String accessToken = null; //獲取tokcen接口 String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ appid+"&secret="+secret; try { URL urlGet = new URL(url); HttpURLConnection http = (HttpURLConnection) urlGet.openConnection(); http.setRequestMethod("GET"); // 必須是get方式請求 http.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); http.setDoOutput(true); http.setDoInput(true); System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 連接超時30秒 System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 讀取超時30秒 http.connect(); InputStream is = http.getInputStream(); int size = is.available(); byte[] jsonBytes = new byte[size]; is.read(jsonBytes); String message = new String(jsonBytes, "UTF-8"); JSONObject demoJson = JSONObject.parseObject(message); accessToken = demoJson.getString("access_token"); log.info("返回accessToken:"+accessToken); log.info("initAccessToken:運行結束..."); is.close(); } catch (Exception e) { e.printStackTrace(); } return accessToken; } }
以上代碼大家還可以使用Spring boot自帶的:RestTemplate
調用發(fā)貨的接口類
@Slf4j public class HttpUtils { private final static String CHARSET_DEFAULT = "UTF-8"; /** * 上傳小程序發(fā)貨 * * @param mchId 商戶號 * @param outTradeNo 商戶訂單號 * @param accessToken accessToken * @param openid 買家openid * @param expressCompany 快遞公司編碼 * @param trackingNo 快遞單號 * @return */ public static String uploadShippingInfo(String mchId, String outTradeNo, String accessToken, String openid, String desc, String expressCompany, String trackingNo) { RestTemplate restTemplate = new RestTemplate(); String url = "https://api.weixin.qq.com/wxa/sec/order/upload_shipping_info?access_token=" + accessToken; HttpHeaders headers = new HttpHeaders(); headers.setContentType(org.springframework.http.MediaType.APPLICATION_JSON); JSONObject orderKey = new JSONObject(); // 訂單單號類型,用于確認需要上傳詳情的訂單。枚舉值1,使用下單商戶號和商戶側單號;枚舉值2,使用微信支付單號。 orderKey.put("order_number_type", 1); orderKey.put("mchid", mchId); //orderKey.put("transaction_id",transactionId); orderKey.put("out_trade_no", outTradeNo); JSONObject shippingList = new JSONObject(); //商品信息 shippingList.put("item_desc", desc); //物流單號,物流快遞發(fā)貨時必填 shippingList.put("tracking_no", trackingNo); // 快遞公司編碼,物流快遞發(fā)貨時必填 shippingList.put("express_company", expressCompany); JSONObject payer = new JSONObject(); payer.put("openid", openid); JSONObject signObject = new JSONObject(); JSONArray shipping_list = new JSONArray(); shipping_list.add(shippingList); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); String uploadTime = simpleDateFormat.format(System.currentTimeMillis()); signObject.put("order_key", orderKey); // 發(fā)貨模式,發(fā)貨模式枚舉值:1、UNIFIED_DELIVERY(統(tǒng)一發(fā)貨)2、SPLIT_DELIVERY(分拆發(fā)貨) 示例值: 1 signObject.put("delivery_mode", 1); // 物流模式,發(fā)貨方式枚舉值:1、實體物流配送采用快遞公司進行實體物流配送形式 2、同城配送 3、虛擬商品,虛擬商品,例如話費充值,點卡等,無實體配送形式 4、用戶自提 signObject.put("logistics_type", 4); signObject.put("shipping_list", shipping_list); signObject.put("upload_time", uploadTime); signObject.put("payer", payer); log.info("發(fā)貨信息:{}", signObject); // 構建包含請求體數(shù)據(jù)和請求頭的HttpEntity對象 HttpEntity<JSONObject> requestEntity = new HttpEntity<JSONObject>(signObject, headers); ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class); String body = responseEntity.getBody(); JSONObject jsonObject = JSONUtil.parseObj(body); String errcode = jsonObject.getString("errcode"); return errcode; } }
注意點
以上AccessToken的有效期是7200秒,為了減少調用,可以保存在本地緩存,如:redis,并設置為7000秒(提前一小段時間結束,以便重新獲取,也可以采用其它的更新策略)
String accessToken = (String) stringRedisService.get(StringEnum.WECHAT_ACCESS_TOKEN.getCode()); if (StringUtils.isEmpty(accessToken)) { accessToken = AccessTokenUtil.getAccessToken(appid, secret); log.info("Access token: " + accessToken); stringRedisService.set(StringEnum.WECHAT_ACCESS_TOKEN.getCode(), accessToken, 7000); }
發(fā)貨成功正常微信端會有以下提醒:
以上代碼在微信小程序服務端后臺-發(fā)貨的方法中直接調用HttpUtils.uploadShippingInfo(String mchId, String outTradeNo, String accessToken, String openid, String desc, String expressCompany, String trackingNo) 即可,其中七個參數(shù)大家需要注意以下就行了。
總結
到此這篇關于如何用java對接微信小程序下單后的發(fā)貨接口的文章就介紹到這了,更多相關java對接微信小程序發(fā)貨接口內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
重新啟動IDEA時maven項目SSM框架文件變色所有@注解失效
這篇文章主要介紹了重新啟動IDEA時maven項目SSM框架文件變色所有@注解失效,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03Java中l(wèi)ist根據(jù)id獲取對象的幾種方式
這篇文章主要給大家介紹了關于Java中l(wèi)ist根據(jù)id獲取對象的幾種方式,文中通過實例代碼介紹的非常詳細,對大家學習或者使用java具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07