如何用java對(duì)接微信小程序下單后的發(fā)貨接口
配置參數(shù)
首先需要獲取Access_token,調(diào)用前,需要到微信小程序平臺(tái)-準(zhǔn)備好小程序的appid 和 密鑰secret這兩個(gè)參數(shù)。
調(diào)用代碼
獲取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:開始運(yùn)行...");
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方式請(qǐng)求
http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 連接超時(shí)30秒
System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 讀取超時(shí)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:運(yùn)行結(jié)束...");
is.close();
} catch (Exception e) {
e.printStackTrace();
}
return accessToken;
}
}以上代碼大家還可以使用Spring boot自帶的:RestTemplate
調(diào)用發(fā)貨的接口類
@Slf4j
public class HttpUtils {
private final static String CHARSET_DEFAULT = "UTF-8";
/**
* 上傳小程序發(fā)貨
*
* @param mchId 商戶號(hào)
* @param outTradeNo 商戶訂單號(hào)
* @param accessToken accessToken
* @param openid 買家openid
* @param expressCompany 快遞公司編碼
* @param trackingNo 快遞單號(hào)
* @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();
// 訂單單號(hào)類型,用于確認(rèn)需要上傳詳情的訂單。枚舉值1,使用下單商戶號(hào)和商戶側(cè)單號(hào);枚舉值2,使用微信支付單號(hào)。
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);
//物流單號(hào),物流快遞發(fā)貨時(shí)必填
shippingList.put("tracking_no", trackingNo);
// 快遞公司編碼,物流快遞發(fā)貨時(shí)必填
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、實(shí)體物流配送采用快遞公司進(jìn)行實(shí)體物流配送形式 2、同城配送 3、虛擬商品,虛擬商品,例如話費(fèi)充值,點(diǎn)卡等,無實(shí)體配送形式 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);
// 構(gòu)建包含請(qǐng)求體數(shù)據(jù)和請(qǐng)求頭的HttpEntity對(duì)象
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;
}
}注意點(diǎn)
以上AccessToken的有效期是7200秒,為了減少調(diào)用,可以保存在本地緩存,如:redis,并設(shè)置為7000秒(提前一小段時(shí)間結(jié)束,以便重新獲取,也可以采用其它的更新策略)
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ā)貨成功正常微信端會(huì)有以下提醒:

以上代碼在微信小程序服務(wù)端后臺(tái)-發(fā)貨的方法中直接調(diào)用HttpUtils.uploadShippingInfo(String mchId, String outTradeNo, String accessToken, String openid, String desc, String expressCompany, String trackingNo) 即可,其中七個(gè)參數(shù)大家需要注意以下就行了。
總結(jié)
到此這篇關(guān)于如何用java對(duì)接微信小程序下單后的發(fā)貨接口的文章就介紹到這了,更多相關(guān)java對(duì)接微信小程序發(fā)貨接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
maven父工程relativepath標(biāo)簽使用解讀
文章主要介紹了在使用Maven構(gòu)建父子工程時(shí)如何通過設(shè)置父工程和子工程的pom文件來管理依賴和版本,當(dāng)子工程是Spring Boot項(xiàng)目時(shí),可以通過關(guān)閉`relativePath`標(biāo)簽來繼承Spring Boot的父工程,同時(shí)在父工程中使用`dependencyManagement`標(biāo)簽來統(tǒng)一管理Spring Boot的依賴版本2024-11-11
重新啟動(dòng)IDEA時(shí)maven項(xiàng)目SSM框架文件變色所有@注解失效
這篇文章主要介紹了重新啟動(dòng)IDEA時(shí)maven項(xiàng)目SSM框架文件變色所有@注解失效,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Java中l(wèi)ist根據(jù)id獲取對(duì)象的幾種方式
這篇文章主要給大家介紹了關(guān)于Java中l(wèi)ist根據(jù)id獲取對(duì)象的幾種方式,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
Java實(shí)現(xiàn)任務(wù)超時(shí)處理方法
任務(wù)超時(shí)處理是比較常見的需求,Java中對(duì)超時(shí)任務(wù)的處理有兩種方式,在文中給大家詳細(xì)介紹,本文重點(diǎn)給大家介紹Java實(shí)現(xiàn)任務(wù)超時(shí)處理方法,需要的朋友可以參考下2019-06-06

