IntraCityExpress 类提供了微信小程序同城配送功能的完整实现,包括门店管理、订单管理、运力管理等功能。
在小程序管理后台开通同城配送功能:
在项目配置文件中添加同城配送相关配置:
// config/params.php
return [
// 同城配送安全token(在小程序管理后台设置)
'wx_intracity_token' => 'your_token_here',
// 其他配置...
];
use common\components\IntraCityExpress;
$storeData = [
'out_store_id' => 'store_001',
'store_name' => '花店总店',
'store_address' => '北京市朝阳区建国路88号',
'store_longitude' => 116.397128,
'store_latitude' => 39.916527,
'store_phone' => '010-12345678',
'service_type' => 1, // 同城配送
];
$result = IntraCityExpress::createStore($storeData);
if ($result['errcode'] === 0) {
echo "门店创建成功";
} else {
echo "门店创建失败:" . $result['errmsg'];
}
$storeInfo = IntraCityExpress::getStore('store_001');
if ($storeInfo['errcode'] === 0) {
print_r($storeInfo);
}
$updateData = [
'out_store_id' => 'store_001',
'store_name' => '花店总店(已更新)',
'store_address' => '北京市朝阳区建国路88号',
'store_longitude' => 116.397128,
'store_latitude' => 39.916527,
'store_phone' => '010-87654321',
];
$result = IntraCityExpress::updateStore($updateData);
$orderData = [
'out_store_id' => 'store_001',
'out_order_id' => 'order_' . time(),
'delivery_service_code' => 'DADA', // 达达配送
'to_user_name' => '张三',
'to_user_phone' => '13800138000',
'to_user_address' => '北京市海淀区中关村大街1号',
'to_user_longitude' => 116.307852,
'to_user_latitude' => 39.984154,
'goods_value' => 10000, // 商品价值(分)
'goods_weight' => 1000, // 商品重量(克)
'goods_pickup_info' => '鲜花一束',
'goods_delivery_info' => '鲜花一束',
'goods_type' => IntraCityExpress::GOODS_TYPE_FLOWER, // 鲜花
'expected_pickup_time' => date('Y-m-d H:i:s', time() + 1800), // 30分钟后取货
'expected_delivery_time' => date('Y-m-d H:i:s', time() + 7200), // 2小时后送达
];
$result = IntraCityExpress::createOrder($orderData);
if ($result['errcode'] === 0) {
$wxOrderId = $result['wx_order_id'];
echo "订单创建成功,微信订单号:" . $wxOrderId;
}
// 通过微信订单号查询
$orderInfo = IntraCityExpress::getOrder($wxOrderId);
// 通过商户订单号查询
$orderInfo = IntraCityExpress::getOrder('', $outOrderId);
// 通过门店订单号查询
$orderInfo = IntraCityExpress::getOrder('', '', $outStoreId);
$result = IntraCityExpress::cancelOrder($wxOrderId);
$orderList = IntraCityExpress::getOrderList(0, 20);
在小程序管理后台设置回调URL:https://your-domain.com/intra-city/callback
// 在控制器中处理回调
public function actionCallback()
{
$callbackData = Yii::$app->request->post();
$token = Yii::$app->params['wx_intracity_token'];
$result = IntraCityExpress::handleOrderCallback($callbackData, $token);
// 返回处理结果
Yii::$app->response->format = Response::FORMAT_JSON;
return $result;
}
$result = IntraCityExpress::mockNotify(
IntraCityExpress::ORDER_STATUS_ACCEPTED, // 配送员接单
$wxOrderId
);
| 接口 | 方法 | 说明 |
|---|---|---|
/intra-city/create-store |
POST | 创建门店 |
/intra-city/update-store |
POST | 更新门店 |
/intra-city/get-store |
GET | 查询门店 |
| 接口 | 方法 | 说明 |
|---|---|---|
/intra-city/create-order |
POST | 创建订单 |
/intra-city/get-order |
GET | 查询订单 |
/intra-city/cancel-order |
POST | 取消订单 |
| 接口 | 方法 | 说明 |
|---|---|---|
/intra-city/callback |
POST | 微信回调接口 |
/intra-city/mock-notify |
POST | 模拟回调(测试用) |
| 错误码 | 说明 | 解决方案 |
|---|---|---|
| 934000 | 其他逻辑错误 | 检查请求参数和业务逻辑 |
| 934001 | 请求参数有误 | 检查必填参数是否完整 |
| 934002 | 订单已存在,且订单在处理中 | 避免重复创建订单 |
| 934003 | 运力ID错误 | 检查运力配置是否正确 |
| 934008 | 门店ID和APPID不匹配 | 检查门店配置 |
| 934009 | 不支持该门店所在城市 | 联系微信客服 |
| 934011 | 请求签名错误 | 检查签名算法和token |
| 934012 | appid和access_token不匹配 | 检查小程序配置 |
| 934013 | 门店余额不足无法下单 | 充值门店余额 |
| 934016 | 订单不存在 | 检查订单ID是否正确 |
| 934019 | 超出运力支持的配送范围 | 选择其他配送方式 |
| 934020 | 商品超重 | 检查商品重量限制 |
| 934021 | 门店不存在 | 先创建门店 |
try {
$result = IntraCityExpress::createOrder($orderData);
if ($result['errcode'] !== 0) {
switch ($result['errcode']) {
case 934021:
echo "门店不存在,请先创建门店";
break;
case 934003:
echo "运力ID错误,请检查运力配置";
break;
case 934019:
echo "超出配送范围,请选择其他配送方式";
break;
default:
echo "其他错误,请联系技术支持";
break;
}
}
} catch (\Exception $e) {
echo "系统异常:" . $e->getMessage();
}