配置参数
首先需要获取Access_token,调用前,需要到微信小程序平台-准备好小程序的appid 和 密钥secret这两个参数。
调用代码
获取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
调用发货的接口类
@Slf4j
public class HttpUtils {
private final static String CHARSET_DEFAULT = "UTF-8";
/**
* 上传小程序发货
*
* @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);
//物流单号,物流快递发货时必填
shippingList.put("tracking_no", trackingNo);
// 快递公司编码,物流快递发货时必填
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);
// 发货模式,发货模式枚举值:1、UNIFIED_DELIVERY(统一发货)2、SPLIT_DELIVERY(分拆发货) 示例值: 1
signObject.put("delivery_mode", 1);
// 物流模式,发货方式枚举值: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("发货信息:{}", signObject);
// 构建包含请求体数据和请求头的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);
}
发货成功正常微信端会有以下提醒:
以上代码在微信小程序服务端后台-发货的方法中直接调用HttpUtils.uploadShippingInfo(String mchId, String outTradeNo, String accessToken, String openid, String desc, String expressCompany, String trackingNo) 即可,其中七个参数大家需要注意以下就行了。