本文主要是介绍如何用java对接微信小程序下单后的发货接口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok...
配置参数
首先需要获取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.opeChina编程nConnection(); 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 = "InpysPYYFUTF-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); android //物流单号,物流快递发货时必填 shippingList.put("tracking_no", trackingNo); // 快递公司编码,物流快递发货时必填 shippingList.put("express_company", expressCjsompany); 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秒(提前一小段时间结束,以便重新获取,也可以采用其它的更新策略)
androidString 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) 即可,其中七个参数大家需要注意以下就行了。
总结
到此这篇关于如何用java对接微信小程序下单后的发货接口的文章就介绍到这了,更多相关java对接微信小程序发货接口内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!
这篇关于如何用java对接微信小程序下单后的发货接口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!