当前位置: 代码网 > it编程>编程语言>Java > 如何用java对接微信小程序下单后的发货接口

如何用java对接微信小程序下单后的发货接口

2025年03月15日 Java 我要评论
配置参数首先需要获取access_token,调用前,需要到微信小程序平台-准备好小程序的appid 和 密钥secret这两个参数。调用代码获取access_tokenimport com.alib

配置参数 

首先需要获取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) 即可,其中七个参数大家需要注意以下就行了。

总结

到此这篇关于如何用java对接微信小程序下单后的发货接口的文章就介绍到这了,更多相关java对接微信小程序发货接口内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com