微信小程序订单发货管理接入

news2025/1/11 12:37:58

订单发货管理接入指引:https://mp.weixin.qq.com/cgi-bin/announce?token=1148555877&action=getannouncement&key=11671435333v04b2&version=1&lang=zh_CN&platform=2icon-default.png?t=N7T8https://mp.weixin.qq.com/cgi-bin/announce?token=1148555877&action=getannouncement&key=11671435333v04b2&version=1&lang=zh_CN&platform=2

发货信息录入接口文档:小程序发货信息管理服务 | 微信开放文档

注意事项

  1. 根据指定的订单单号类型,采用不同参数给指定订单上传物流信息:

    (1). 商户侧单号形式(枚举值1),通过下单商户号和商户侧单号确定一笔订单

    (2). 微信支付单号形式(枚举值2),通过微信支付单号确定一笔订单

  2. 发货模式根据具体发货情况选择:

    (1). 统一发货(枚举值1),一笔订单统一发货,只有一个物流单号。

    (2). 分拆发货(枚举值2),一笔订单分拆发货,包括多个物流单号。

  3. 物流公司编码,参见获取运力 id 列表get_delivery_list。

  4. 上传时间,用于标识请求的先后顺序,如果要更新物流信息,上传时间必须比之前的请求更新,请按照 RFC 3339 格式填写。

  5. 分拆发货仅支持使用物流快递发货,一笔支付单最多分拆成 10 个包裹。

  6. 以下情况将视为重新发货,每笔支付单仅有一次重新发货机会。

    (1). 对已完成发货的支付单再次调用该 API。

    (2). 使用该 API 修改发货模式或物流模式。

<?php

namespace app\v1\controller;

use app\common\controller\Checking;
use think\Cache;
use think\Controller;
use think\Db;

/**
 * 微信发货管理
 */
class WechatShip extends Controller
{
    protected $appid;
    protected $appSecret;
    public function __construct()
    {
        $this->appid ='';
        $this->appSecret ='';
    }
    /**
     * 发货
     * @return void
     */
    public function deliver_addr()
    {
        $order_lists=$this->get_order_list(['order_state'=>1]);
        $transaction_ids=array_column($order_lists['order_list'],'transaction_id');
        $order_shipping_info=Db::name('szy_lionfish_comshop_order')
            ->alias('o')
            ->join('szy_lionfish_comshop_order_goods g','o.order_id=g.order_id','LEFT')
            ->whereIn('o.transaction_id',$transaction_ids)
            ->column('o.shipping_no,o.shipping_method,g.name','o.transaction_id');
        foreach ($order_lists['order_list'] as $k=>$v){
            $wxorder = $this->getWxSendOrderStatus($v['transaction_id']);
            if($wxorder['errcode'] != 0){
                Checking::writeLog('获取微信订单失败-'.$v['transaction_id'],'error','wxfh.log');
                continue;
            }
            if (empty($order_shipping_info[$v['transaction_id']]['shipping_no'])){
                continue;
            }
            $order_state = $wxorder['order']['order_state']; //订单状态枚举:(1) 待发货;(2) 已发货;(3) 确认收货;(4) 交易完成;(5) 已退款。
            if($order_state == 1){
                $data = [
                    'transaction_id'=>$wxorder['order']['transaction_id'],//微信交易单号
                    'openid'=>$wxorder['order']['openid'],//支付用户openid
                    'item_desc'=>$order_shipping_info[$v['transaction_id']]['name'],//商品名
                    'express_name'=>$order_shipping_info[$v['transaction_id']]['shipping_method'],//快递名
                    'express_no'=>$order_shipping_info[$v['transaction_id']]['shipping_no'],//快递单号
                ];
                $results = $this->sendDelivery($data,1);
                if ($results['errcode'] == 0) {
                    Checking::writeLog('发货成功-'.$v['transaction_id'],'success','wxfh.log');
                } else {
                    Checking::writeLog('发货失败-'.$v['transaction_id'],$results['errmsg'],'wxfh.log');
                }
            }

        }
       
    }

    /**
     * 获取token
     * @return mixed
     */
    public function getAccessToken(){
        $appId = $this->appid;
        $appSecret = $this->appSecret;
        $cacheKey = $appId . '@access_token';
        if (!Cache::get($cacheKey)) {
            // 请求API获取 access_token
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appId}&secret={$appSecret}";
            $result = Checking::GetHttp($url);
            $data = json_decode($result, true);
            // return $data['access_token'];
            // 写入缓存
            Cache::set($cacheKey, $data['access_token'], 7200);    // 7000
        }
        return Cache::get($cacheKey);
    }

    /**
     * 快递公司
     */
    public function get_delivery_list()
    {
        $token = $this->getAccessToken();
        $url = "https://api.weixin.qq.com/cgi-bin/express/delivery/open_msg/get_delivery_list?access_token=" . $token;
//        $data = json_encode([], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
        $result = Checking::request_post_json($url, '{}');
        $result = json_decode($result[1], true);

        return $result;
    }

    /**
     * 获取订单列表
     */
    public function get_order_list($data)
    {
//        $data = [
//            'pay_time_range' => [
//                'begin_time'=>1719714996,//起始时间,时间戳形式,不填则视为从0开始
//                'end_time'=>time()//结束时间(含),时间戳形式,不填则视为32位无符号整型的最大值
//            ],
//            'order_state'=>1,//订单状态枚举:(1) 待发货;(2) 已发货;(3) 确认收货;(4) 交易完成;(5) 已退款
            'openid'=>'',//支付者openid
            'last_index'=>'',//翻页时使用,获取第一页时不用传入,如果查询结果中 has_more 字段为 true,则传入该次查询结果中返回的 last_index 字段可获取下一页
            'page_size'=>''//翻页时使用,返回列表的长度,默认为100
//
//        ];
        $token = $this->getAccessToken();
        $url = "https://api.weixin.qq.com/wxa/sec/order/get_order_list?access_token=" . $token;
        $data = json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
        $result = Checking::request_post_json($url, $data);
        $result = json_decode($result[1], true);

        return $result;
    }

    /**
     * 获取发货订单信息
     * @param $transaction_id
     * @return mixed
     */
    public function getWxSendOrderStatus($transaction_id)
    {
        $token = $this->getAccessToken();
        $url = "https://api.weixin.qq.com/wxa/sec/order/get_order?access_token=" . $token;
        $data = [
            'transaction_id' => $transaction_id
        ];
        $data = json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
        $result = Checking::request_post_json($url, $data);
        $result = json_decode($result[1], true);

        return $result;
    }
    /**
     * 设置微信发货后,消息跳转地址,不设置为默认
     * @return void
     */
    public function set_jump_path()
    {
        $token = $this->getAccessToken();
        $url = "https://api.weixin.qq.com/wxa/sec/order/set_msg_jump_path?access_token=" . $token;
        $data = [
            'path' => 'comshop/pages/order/index?conmen=3', //待收货订单列表页面
        ];
        $data = json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
        Checking::request_post_json($url, $data);

    }
    //发货 物流15天自动确认,虚拟商品隔天自动确认
    public function sendDelivery($order, $logistics_type=3)
    {
        $this->set_jump_path();

        $token = $this->getAccessToken();

        $express_name = "";
        $express_no = "";
        if ($logistics_type == 1) {
            $express_name = $order['express_name'];
            $express_no = $order['express_no'];
        }

        $data = [
            'order_key' => [
                'order_number_type' => 2,   //订单单号类型,用于确认需要上传详情的订单。枚举值1,使用下单商户号和商户侧单号;枚举值2,使用微信支付单号。
                'transaction_id' => $order['transaction_id']
            ],
            'logistics_type' => $logistics_type,//物流模式,发货方式枚举值:1、实体物流配送采用快递公司进行实体物流配送形式 2、同城配送 3、虚拟商品,虚拟商品,例如话费充值,点卡等,无实体配送形式 4、用户自提
            'delivery_mode' => 1,   //发货模式,发货模式枚举值:1、UNIFIED_DELIVERY(统一发货)2、SPLIT_DELIVERY(分拆发货) 示例值: UNIFIED_DELIVERY
            'shipping_list' => [
                [
                    'tracking_no' => $express_no,
                    'express_company' => $express_name,
                    'item_desc' => $order['item_desc'] ?? "订单发货信息"
                ]
            ],
            'upload_time' => date('Y-m-d\TH:i:sP', time()),
            'payer' => [
                'openid' => $order['openid']
            ]
        ];

        $urlss = "https://api.weixin.qq.com/wxa/sec/order/upload_shipping_info?access_token=" . $token;
        $data = json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
        $results = Checking::request_post_json($urlss, $data);

        $results = json_decode($results[1], true);
        return $results;

    }

}
    /**
     * get
     * @param string $url 请求地址
     */
    public static function GetHttp($url){
        // 关闭句柄
        $curl = curl_init(); // 启动一个CURL会话
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_HEADER, 0);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
        // 设置Accept头部字段
        curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/json'));
        // 设置User-Agent头部字段
        curl_setopt($curl, CURLOPT_USERAGENT, 'My User Agent String');
        $tmpInfo = curl_exec($curl); //返回api的json对象
        if(curl_exec($curl) === false)
        {
            return 'Curl error: ' . curl_error($curl);
        }
        //关闭URL请求
        curl_close($curl);
        return $tmpInfo; //返回json对象
    }
    /**
     * 模拟post进行url请求
     * @param string $url
     * @param string $data_string
     */
        public static function request_post_json($url, $data_string) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                "Content-Type: application/json; charset=utf-8",
                "Content-Length: " . strlen($data_string))
        );
        ob_start();
        curl_exec($ch);
        $return_content = ob_get_contents();
        ob_end_clean();
        $return_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        return array($return_code, $return_content);

    }

    //请确保项目文件有可写权限,不然打印不了日志。
    public static function writeLog( $text, $message = '', $name = "log.txt" )
    {
        file_put_contents( $name, date( "Y-m-d H:i:s" ) . "  " . $text . '-----' . $message . "\r\n", FILE_APPEND );
    }

小程序端

   wx.openBusinessView({
      businessType: 'weappOrderConfirm',
      extraData: {
        merchant_id: '',//商户id
        // merchant_trade_no: '1234323JKHDFE1243252',
        // transaction_id: '4200002336202407032185573612'
        transaction_id:that.data.order.order_info.transaction_id//微信交易单号
      },
      success(res) {
      console.log('调起确认收货');
      console.log(res)
      if(res.extraData.status=="success"){
        app.util.request({
          'url': 'entry/wxapp/index',
          'data': {
            controller: 'order.receive_order',
            token: token,
            order_id: id
          },
          dataType: 'json',
          success: function(res) {
            if (res.data.code == 0) {
              wx.showToast({
                title: '收货成功',
                icon: 'success',
                duration: 1000
              })
       
              that.reload_data();
            } else {
              app.util.message(res.data.msg||'收货失败', '', 'error');
            }
          }
        });
      }
        //dosomething
      },
      fail(res) {
        //dosomething
        console.log(that.data.order.order_info.transaction_id)
        console.log(res)
      },
      complete() {
        //dosomething
      }
    }); 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1889166.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis基础教程(十):HyperLogLog

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

掌握IP代理API提取技巧,让你的网络操作更高效!

IP代理在现代网络中扮演着越来越重要的角色。今天&#xff0c;我们将深入探讨IP代理的API提取知识&#xff0c;帮助大家更好地理解和应用这一技术。 IP代理API是什么&#xff1f; IP代理API是提供IP代理服务的接口&#xff0c;允许开发者通过编程方式自动获取和管理代理IP。通…

土壤养分检测仪——助力农田监测

在现代化的农业生产中&#xff0c;精准施肥、科学种植已成为提升作物产量与品质的关键。为了实现这一目标&#xff0c;土壤养分检测仪成为了农田科技的得力助手。这款仪器不仅配备了成品药剂和检测器材&#xff0c;还能在现场进行快速测定&#xff0c;广泛应用于农田土壤养分的…

干式电抗器的工作原理是什么

干式电抗器是电力系统中常用的无功补偿设备&#xff0c;主要用于调节电网的电压、提高功率因数、限制短路电流等。它的工作原理主要是通过在电路中引入一个与负载电流相反的磁场&#xff0c;从而产生一个与负载电流相抵消的电抗力&#xff0c;达到调节电压和功率因数的目的。 干…

昇思25天学习打卡营第12天|linchenfengxue

DCGAN生成漫画头像 通过示例代码说明DCGAN网络如何设置网络、优化器、如何计算损失函数以及如何初始化模型权重。 GAN基础原理 生成式对抗网络(Generative Adversarial Networks&#xff0c;GAN)是一种生成式机器学习模型&#xff0c;是近年来复杂分布上无监督学习最具前景的…

全面详解菲律宾slots游戏本土网盟广告CPI流量效果分析

全面详解菲律宾slots游戏本土网盟广告CPI流量效果分析 一、引言 随着互联网的普及和移动设备的广泛应用&#xff0c;网络游戏行业迅速崛起&#xff0c;成为全球娱乐市场的一大热门。菲律宾作为东南亚地区的重要国家&#xff0c;其网络游戏市场也呈现出蓬勃的发展势头。在这样的…

免费分享:2022年全国地铁站点数据(附下载方法)

数据简介 2022年全国地铁站点数据不仅反应我国城市交通网络的日益完善&#xff0c;也为城市规划、公共交通优化、商业布局、应急响应及智慧城市建设提供了宝贵的数据支持与参考&#xff0c;助力城市发展与居民生活质量的全面提升。 数据属性 数据名称&#xff1a;全国地铁站点…

iPhone苹果手机怎么取消腾讯视频VIP会员自动续费?

腾讯视频会员分为VIP&#xff08;同时在线设备5台、同时播放设备2台&#xff1b;&#xff09;和SVIP&#xff08;同时在线设备8台、同时播放设备3台&#xff1b;&#xff09;&#xff0c;在iPhone苹果手机上开通腾讯视频连续包月、包季、包年后&#xff0c;需要手动取消才能关闭…

全网最全最细的jmeter接口测试教程,建议收藏

在日常工作中&#xff0c;尤其是做接口测试时&#xff0c;我们最经常用到的两个工具&#xff0c;就是Jmeter和postman。今天&#xff0c;我们主要是讲一讲Jmeter在接口测试这一块的一些方式方法。内容比较多&#xff0c;大家可以收藏一下&#xff0c;以后慢慢学。 1&#xff0…

【QT】概述|对象树模型|两种控件模式|信号和槽|lambda

目录 什么是QT 特点 QT程序 main函数 QT按钮 纯代码模式 图形化模式 对象树模型 信号和槽 连接与断开 自动连接 断开连接 信号的发射 lambda表达式 基本语法 捕获列表 Lambda表达式用于信号与槽的连接 例如 什么是QT Qt是一个跨平台的C图形用户界面应用…

AJAX的概述 ,同步和异步的区别 ,AJAX 的交互模型和传统交互模型的区别

一. AJAX的概述 1.1 什么是ajax 同步&#xff1a; 异步&#xff1a; 1.AJAX Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 ​ 说明&#xff1a;异步&#xff1a;就是不同步。例如我们向后台发送请求&#xff0c;同步的方式是后台必…

南京·2024江苏眼睛健康产业展览会观众邀请·徐州站

6月29日&#xff0c;南京2024全国眼睛健康产业博览会暨眼科医学大会&#xff0c;组委会一行六人来到国家级历史文化名城-徐州&#xff0c;开启了南京全国眼博会江苏省十三个城市线下观众邀请的徐州站工作。徐州&#xff0c;作为华东重要门户城市&#xff0c;华东地区重要的科教…

牛客小白月赛97

A.三角形 判断等边三角形&#xff0c;题不难&#xff0c;代码如下&#xff1a; #include <iostream>using namespace std;int a[110];int main() {int n;cin >> n;int x;int mx 0;for(int i 1; i < n; i){cin >> x;mx max(mx, x);a[x];}for(int i 1…

layui-页面布局

1.布局容器 分为固定和完整宽度 class layui-container 是固定宽度 layui-fluid是完整宽度

【Python】Python的安装与环境搭建

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️Python】 文章目录 前言Python下载环境配置测试环境变量是否配置成功配置环境变量 运行Python交互式解释器&#xff1a;命令行脚本集成开发环境&#xff08;IDE&#xff1a;Integrated Development E…

【Python机器学习】模型评估与改进——回归指标

对于回归问题&#xff0c;可以像分类问题一样进行详细评估&#xff0c;例如&#xff0c;对目标值估计过高与目标值估计过低进行对比分析。 但是&#xff0c;对于我们见过的大多数应用来说&#xff0c;使用默认就足够了&#xff0c;它由所有回归器的score方法给出。业务决策有时…

四个Python代码片段,全面掌握下划线 “_”的妙用!

在Python的世界里&#xff0c;下划线“_”不仅是一个简单的符号&#xff0c;它还承载了许多编程的小技巧&#xff0c;可以让你的编码工作变得更加轻松和高效。 1、快速回顾&#xff1a;下划线在控制台的神秘力量 当你在Python控制台进行连续计算时&#xff0c;知道如何快速引…

智能胎教仪,科技与教育的融合-N9301胎教仪语音方案

随着科学技术的不断进步&#xff0c;人们对婴幼儿教育的认知也日趋成熟和全面。其中&#xff0c;胎教作为一种重要的早期教育方式&#xff0c;近年来备受瞩目。而胎教仪语音芯片的研发&#xff0c;正是为了满足这一需求&#xff0c;为胎儿的健康成长提供更加便捷的胎教方案。 一…

绝区零卡顿严重、延迟高的解决方法提前看

绝区零这款游戏背后是一个错综复杂的架空世界&#xff0c;仿佛一幅波澜壮阔的史诗画卷缓缓展开。在这个世界中&#xff0c;神秘莫测的“空洞”灾害如影随形&#xff0c;给大地带来了无尽的破坏和混沌。经过米哈游团队的精心雕琢&#xff0c;无论是画面UI的细腻呈现&#xff0c;…

Java 虚拟机 一

运行时数据区 我们先看线程隔离的数据区 程序计数器 程序计数器&#xff08; Program Counter Register&#xff09; 是一块较小的内存空间&#xff0c; 它可以看作是当前线程所执行的字节码的行号指示器。 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执…