中通开放平台简介——SDK使用示例

本文介绍了中通开放平台的SDK使用示例,包括JAVA、NODEJS、PHP和C#四种语言的详细代码,帮助开发者快速接入并进行API调用,实现与中通系统的系统对接。

中通开放平台(以下简称“平台”)是提供中通大客户一站式接入服务的平台,提供各项API的接入服务,供客户、第三方软件供应商或第三方服务商与中通进行系统对接,连通与中通系统之间的信息流,实现整体物流数据的信息化,为合作伙伴提供极致的服务体验。

SDK使用示例-JAVA
github地址:https://github.com/ZTO-Express/zopsdk-java

请修改pom.xml,在其中添加以下内容:

zto-maven https://dl.bintray.com/chocotan/maven com.zto.zop zopsdk 0.6

以下是调用示例:

String appKey = “这里是appKey”;
String appSecret = “这里是appSecret”;
ZopClient client = new ZopClient(appKey, appSecret);
ZopPublicRequest request = new ZopPublicRequest();
String body = “这里是请求body”;
request.setBody(body);
request.setUrl(“https://japi-test.zto.com/zto.open.createOrder”);
System.out.println(client.execute(request))

SDK使用示例-NODEJS
github地址:https://github.com/ZTO-Express/zopsdk-node

npm install zopsdk-node

var zop_client = require(“zopsdk-node”);
zop_client.init(“这里是appKey”, “这里是appSecret”);
let request = {
url: “https://japi-test.zto.com/submitOrderCode”,
body: “这里是body”
};
// 本模块http请求使用的是node-fetch库
let response = zop_client.execute(request);
response.then(res => res.text())
.then(body => console.log(body));

SDK使用示例-PHP
github地址:https://github.com/ZTO-Express/zopsdk-php

请将github项目clone下来,并将其中的代码复制到你自己项目中

以下是示例:

use zop\ZopClient;
use zop\ZopProperties;
use zop\ZopRequest;

package com.weishitechsub.kdcxqwb.fragment.Adapter; import android.Manifest; import android.app.AlertDialog; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Handler; import android.os.Looper; import android.provider.Settings; import android.text.TextUtils; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.viewholder.BaseViewHolder; import com.weishitechsub.kdcxqwb.R; import com.weishitechsub.kdcxqwb.bean.ListBean; import com.weishitechsub.kdcxqwb.utils.PackageNotificationSender; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; public class MyCourierAdapter extends BaseQuickAdapter<ListBean, BaseViewHolder> { private static final String TAG = "MyCourierAdapter"; private List<ListBean> mTrackList; private Context context; // 存储:用户手动开启了提醒的单号 private final Set<String> remindedEnabled = ConcurrentHashMap.newKeySet(); // 存储:每个单号最后一次被提醒到的状态(用于去重) private final Map<String, String> remindedStates = new ConcurrentHashMap<>(); private Handler mainHandler = new Handler(Looper.getMainLooper()); private static final String PREF_NAME = "courier_reminder"; public MyCourierAdapter(List<ListBean> list, Context context) { super(R.layout.my_courier_adapter, list); this.context = context; } @Override protected void convert(@NonNull BaseViewHolder baseViewHolder, ListBean dataBean) { String number = dataBean.getNum(); baseViewHolder.setText(R.id.tv_number, number); baseViewHolder.setText(R.id.tv_address, dataBean.getContext()); // 设置快递公司信息和图标 if (dataBean.getType() != null) { String trackName = getTrackName(dataBean.getType()); baseViewHolder.setText(R.id.tv_type, trackName); ImageView logo = baseViewHolder.getView(R.id.iv_logo); LinearLayout line = baseViewHolder.getView(R.id.line); setCompanyLogo(trackName, logo, line); } // ===== 核心逻辑:状态变更检测 + 条件性知 ===== String state = dataBean.getState(); if (state != null) { baseViewHolder.setText(R.id.tv_state, getStateText(state)); // === 新增:如果是终止状态,自动关闭提醒并记录最终状态 === if ("3".equals(state) || "4".equals(state) || "6".equals(state)) { remindedEnabled.remove(number); // 清除开启标记 remindedStates.put(number, state); // 记录最终状态 } // 关键点:只有在【用户开启了提醒】的前提下才进行知 if (remindedEnabled.contains(number)) { String oldState = remindedStates.get(number); // 只有当 oldState 不为 null(即不是第一次)且状态变化时才提醒 if (oldState != null && !state.equals(oldState)) { String company = getTrackName(dataBean.getType()); sendStatusNotification(number, company, getStateText(state), getNotifyContent(state)); } // 更新最后提醒状态 remindedStates.put(number, state); } } // ===== 绑定 iv_remind 按钮:根据状态决定是否可操作 ===== ImageView ivRemind = baseViewHolder.getView(R.id.iv_remind); refreshRemindIcon(ivRemind, number); // 初始图标 if ("3".equals(state) || "4".equals(state) || "6".equals(state)) { // 已签收 / 拒签 / 退回 → 不允许开启提醒 ivRemind.setOnClickListener(v -> { String tip = "3".equals(state) ? "该快递已签收,无需提醒。" : "4".equals(state) ? "该快递已拒签,订单结束。" : "该快递已被退回。"; Toast.makeText(context, tip, Toast.LENGTH_SHORT).show(); }); ivRemind.setAlpha(0.5f); // 置灰 ivRemind.setEnabled(false); // 禁用点击 } else { // 正常流转状态 → 允许开启/关闭提醒 ivRemind.setOnClickListener(v -> { if (remindedEnabled.contains(number)) { remindedEnabled.remove(number); Toast.makeText(context, "已关闭提醒: " + number, Toast.LENGTH_SHORT).show(); } else { enableReminderWithPermissionCheck(number); } refreshRemindIcon(ivRemind, number); }); ivRemind.setEnabled(true); ivRemind.setAlpha(1.0f); // 正常透明度 } } // 检查权限后开启提醒 private void enableReminderWithPermissionCheck(String number) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { new AlertDialog.Builder(context) .setTitle("需要知权限") .setMessage("请允许本应用发送快递状态提醒知。\n\n进入【设置】→【知】中开启权限。") .setPositiveButton("去开启", (d, w) -> { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.fromParts("package", context.getPackageName(), null)); context.startActivity(intent); }) .setNegativeButton("取消", null) .show(); return; } } remindedEnabled.add(number); Toast.makeText(context, "已开启提醒: " + number, Toast.LENGTH_SHORT).show(); } // 刷新提醒按钮图标 private void refreshRemindIcon(ImageView ivRemind, String number) { if (remindedEnabled.contains(number)) { ivRemind.setImageResource(R.mipmap.button_on); // 🔔 开启状态 } else { ivRemind.setImageResource(R.mipmap.button_off); // 🔕 关闭状态 } } // 获取状态中文文本 private String getStateText(String state) { switch (state) { case "0": return "在途"; case "5": return "派件"; case "3": return "签收"; case "6": return "退回"; case "4": return "退签"; default: return "转投"; } } // 获取对应状态的知内容 private String getNotifyContent(String state) { switch (state) { case "0": return "您的快递已在运输途中,正在路上~"; case "5": return "快递员正在为您派送,请注意查收!"; case "3": return "您的快递已签收,感谢使用!"; case "6": return "很遗憾,您的快递因故被退回。"; case "4": return "您已拒签该快递,订单已完成。"; default: return "快递因地址问题已转投其他网点。"; } } // 发送状态变更知 private void sendStatusNotification(String number, String company, String titleSuffix, String content) { PackageNotificationSender sender = new PackageNotificationSender(context); int id = ("status_" + number).hashCode() & Integer.MAX_VALUE; id = (id % 1_000_000) + 2000; // 控制 ID 范围,避免冲突 sender.sendCustomNotification(id, "📌 快递" + titleSuffix, content, number, company); } // 根据 type 查找快递公司名称 private String getTrackName(String type) { if (mTrackList != null) { for (ListBean item : mTrackList) { if (item.getNum() != null && type != null && TextUtils.equals(item.getNum(), type)) { return item.getCom(); } } } return ""; } // 设置外部数据源 public void setTrackList(List<ListBean> list) { this.mTrackList = list; } // 可选:暴露方法供外部查询某单号是否开启提醒 public boolean isReminderEnabled(String number) { return remindedEnabled.contains(number); } /** * 根据快递公司名称设置对应的 Logo 图标 * @param name 快递公司名称(如“顺丰速运”) * @param logo ImageView 控件 * @param line 默认显示的文字横线(当无 logo 时显示) */ private void setCompanyLogo(String name, ImageView logo, LinearLayout line) { if (name == null || name.isEmpty()) { logo.setVisibility(View.GONE); line.setVisibility(View.VISIBLE); return; } switch (name) { case "邮政快递包裹": logo.setImageResource(R.mipmap.img_yz_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "京东物流": logo.setImageResource(R.mipmap.img_jd_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "圆快递": logo.setImageResource(R.mipmap.img_yt_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "中快递": logo.setImageResource(R.mipmap.img_zt_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "顺丰速运": logo.setImageResource(R.mipmap.img_sf_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "韵达快递": logo.setImageResource(R.mipmap.img_yd_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "申快递": logo.setImageResource(R.mipmap.img_st_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; case "EMS": logo.setImageResource(R.mipmap.img_ems_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); break; default: logo.setVisibility(View.GONE); line.setVisibility(View.VISIBLE); break; } } private SharedPreferences getPrefs() { return context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); } // 在 MyCourierAdapter 类中添加: public void loadSavedStates() { SharedPreferences prefs = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); Set<String> savedEnabled = prefs.getStringSet("enabled_list", new HashSet<>()); remindedEnabled.clear(); remindedEnabled.addAll(savedEnabled); // 可选:也可以恢复状态记录(convert 时会自动更新) remindedStates.clear(); for (String num : savedEnabled) { String state = prefs.getString("state_" + num, null); if (state != null) { remindedStates.put(num, state); } } } public void saveAllStates() { SharedPreferences prefs = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); editor.clear(); // 清除旧数据 // 保存开启的单号 editor.putStringSet("enabled_list", new HashSet<>(remindedEnabled)); // 保存每个单号最后的状态 for (Map.Entry<String, String> entry : remindedStates.entrySet()) { editor.putString("state_" + entry.getKey(), entry.getValue()); } editor.apply(); // 异步保存 } }R.id.iv_remind这个控件保存状态不让他返回上一个页面状态就没了
最新发布
11-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值