php://input 和 $HTTP_ROW_POST_DATE

本文记录了解决微信H5支付中回调参数接收失败的问题,详细介绍了使用php://input读取原始POST数据的方法,对比$HTTP_RAW_POST_DATA,适用于enctype非'multipart/form-data'场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

年前又换了一家公司。毕业半年,加上之前的实习,第四家公司了。短短半年经历了很多,就这样度过了我的2018。毕业、实习、就业、创业、公司倒闭、频繁跳槽、开工作室净赔。年前自我感觉糟透了,一团糟,别人稳定的就业,自己动荡的半年。不过也懂得了个道理,没有稳定的工作,只有稳定的能力。所以2019继续前行。

今天来记录下前些天碰到的个问题。对接微信H5支付时处理微信回调的参数,接收不到、试着用了POST、GET方式去接收、获取的数据都是空的,一脸懵。检查了很多次代码,测试都是不行的...后来通过postMan测试的demo来接收XML格式的返回数据,接收到的也为空。请教了新公司的前辈,得到--php://input。测试成功,所以就自己度娘一下这是个啥东东,学习下。

内容:

参考博文:

php://input 是PHP的输入流。

其官方的描述“php://input allows you to read raw POST data. It is a less memory intensive alternative to $HTTP_RAW_POST_DATA and does not need any special php.ini directives. php://input is not available with enctype=”multipart/form-data”.

翻译:“php://input可以读取没有处理过的POST数据。相较于$HTTP_RAW_POST_DATA而言,它给内存带来的压力较小,并且不需要特殊的php.ini设置。php://input不能用于enctype=multipart/form-data”

从中引出了两个关键,一个就是php://input读取的是没有处理过的POST数据、也只能是POST。第二个就是引出了两一个接收方式$HTTP_ROW_POST_DATA。

转载于:https://www.cnblogs.com/lsrd/p/10456153.html

/ -- 在线客服聊天 --> 认证失败,重新设置聊天系统的用户密码 // 聊天窗口右侧默认展示最近订单,如果想要展示商品、订单、店铺则需要在当前页面中设置隐藏域,name必须为 chat_goods_id, // chat_order_id, chat_supp_id /* ------------------------------------------------------ */ function action_authfail () { $user_id = $_SESSION['user_id']; $sql = "select user_name, password, email from " . $GLOBALS['ecs']->table('users') . " where user_id = '$user_id'"; $row = $db->getRow($sql); $success = create_of_user($user_id, $row['password'], $row['user_name'], $row['email'], 10, - 1); if($success) { $result = array( 'error' => 1,'message' => '可能由于网络原因,发生错误!请点击 <a href="chat.php?act=chat"><strong>重试</strong></a> ,重新连接...','content' => '' ); } else { $result = array( 'error' => 1,'message' => '由于网络原因,发生错误!请点击 <a href="chat.php?act=chat"><strong>重试</strong></a> ,重新连接...','content' => '' ); } $result = json_encode($result); exit($result); } /** * 用户离线 */ function action_off_line() { // 用户超过5分钟未发言则视为自动离线,更新客服状态 } function is_telephone ($phone) { $chars = "/^13[0-9]{1}[0-9]{8}$|15[0-9]{1}[0-9]{8}$|18[0-9]{1}[0-9]{8}$/"; if(preg_match($chars, $phone)) { return true; } } /** * 获取db对象 * * @return unknown */ function get_database () { return $GLOBALS['db']; } /** * 获取smarty对象 * * @return unknown */ function get_smarty () { return $GLOBALS[smarty]; } /** * 获取ecs对象 * * @return unknown */ function get_ecs () { return $GLOBALS['ecs']; } /* * 获取商品所对应店铺的店铺基本信息 * @param int $suppid 店铺id * @param int $suppinfo 入驻商的信息 */ function get_dianpu_baseinfo ($suppid = 0) { if(intval($suppid) <= 0) { return; } $sql_supplier = "SELECT s.supplier_id,s.supplier_name,s.add_time,sr.rank_name FROM " . $GLOBALS['ecs']->table("supplier") . " as s left join " . $GLOBALS['ecs']->table("supplier_rank") . " as sr ON s.rank_id=sr.rank_id WHERE s.supplier_id=" . $suppid . " AND s.status=1"; $supp_info = $GLOBALS['db']->getRow($sql_supplier); $sql = "SELECT * FROM " . $GLOBALS['ecs']->table('supplier_shop_config') . " WHERE supplier_id = " . $suppid; $shopinfo = $GLOBALS['db']->getAll($sql); $config = array(); foreach($shopinfo as $value) { $config[$value['code']] = $value['value']; } $shop_info = array(); $shop_info['ghs_css_path'] = 'themes/' . $config['template'] . '/images/ghs/css/ghs_style.css'; // 入驻商所选模板样式路径 $shoplogo = empty($config['shop_logo']) ? 'themes/' . $config['template'] . '/images/dianpu.jpg' : $config['shop_logo']; $shop_info['shoplogo'] = $shoplogo; // 商家logo $shop_info['shopname'] = htmlspecialchars($config['shop_name']); // 店铺名称 $shop_info['suppid'] = $suppid; // 商家名称 $shop_info['suppliername'] = htmlspecialchars($supp_info['supplier_name']); // 商家名称 $shop_info['userrank'] = htmlspecialchars($supp_info['rank_name']); // 商家等级 $shop_info['region'] = get_province_city($config['shop_province'], $config['shop_city']); $shop_info['address'] = $config['shop_address']; $shop_info['serviceqq'] = $config['qq']; $shop_info['serviceww'] = $config['ww']; $shop_info['serviceemail'] = $config['service_email']; $shop_info['servicephone'] = $config['service_phone']; $shop_info['createtime'] = gmdate('Y-m-d', $config['add_time']); // 商家创建时间 $suppid = (intval($suppid) > 0) ? intval($suppid) : intval($_GET['suppId']); return $shop_info; } 构建多商户人工客服系统
最新发布
07-16
// 修改后的test.js代码 // 创建DataManager实例 let dataManager; window.addEventListener('message', function(event) { if (event.source === window.parent && event.data === 'DataManagerReady') { dataManager = window.parent.dataManager; intn() } }); // 扁平化数据结构(核心修改) function flattenData(data) { const result = []; // 遍历所有订单 data.dingdans.forEach(dingdan => { // 遍历订单中的产品 dingdan.dingdan_chanpin?.forEach(dc => { const chanpin = dc.chanpin; // 遍历产品中的组件 chanpin.chanpin_zujian.forEach(cz => { const zujian = cz.zujian; const bancai = cz.bancai; const kucun = bancai.kucun; // 计算订单用量 = 产品数量 × 组件数量 × 单件用量 const orderUsage = dc.shuliang * cz.zujianshu * cz.one_howmany; // 计算订单可用板材数量 const orderAvailable = dataManager.getAvailableBancaisForOrder(dingdan.id)[bancai.id] || 0; // 创建扁平化数据对象 result.push({ dingdan: dingdan, dingdan_chanpin: dc, chanpin: chanpin, chanpin_zujian: cz, zujian: zujian, bancai: bancai, kucun: kucun, orderUsage: orderUsage, orderAvailable: orderAvailable }); }); }); }); return result; } // 更新统计卡片(修改为动态生成) function updateStatistics(data) { const $cards = $('#statsCards'); $cards.empty(); // 订单总数 $cards.append(` <div class="col-md-3"> <div class="card bg-primary text-white"> <div class="card-body"> <div class="d-flex align-items-center"> <i class="bi bi-clipboard-data fs-1 me-3"></i> <div> <h5 class="card-title">订单总数</h5> <p class="card-value fs-4 mb-0">${data.dingdans.length}</p> </div> </div> </div> </div> </div> `); // 产品种类 $cards.append(` <div class="col-md-3"> <div class="card bg-success text-white"> <div class="card-body"> <div class="d-flex align-items-center"> <i class="bi bi-box-seam fs-1 me-3"></i> <div> <h5 class="card-title">产品种类</h5> <p class="card-value fs-4 mb-0">${data.chanpins.length}</p> </div> </div> </div> </div> </div> `); // 板材种类 $cards.append(` <div class="col-md-3"> <div class="card bg-info text-white"> <div class="card-body"> <div class="d-flex align-items-center"> <i class="bi bi-grid fs-1 me-3"></i> <div> <h5 class="card-title">板材种类</h5> <p class="card-value fs-4 mb-0">${data.bancais.length}</p> </div> </div> </div> </div> </div> `); // 库存总量 const totalStock = data.kucuns.reduce((sum, kucun) => sum + kucun.shuliang, 0); $cards.append(` <div class="col-md-3"> <div class="card bg-warning text-dark"> <div class="card-body"> <div class="d-flex align-items-center"> <i class="bi bi-box2 fs-1 me-3"></i> <div> <h5 class="card-title">库存总量</h5> <p class="card-value fs-4 mb-0">${totalStock}</p> </div> </div> </div> </div> </div> `); } // 渲染表格(修改为显示订单可用板材) function renderTable(dataArray) { const $tbody = $('#resultBody'); $tbody.empty(); if (dataArray.length === 0) { $('#noResults').show(); $('#resultCount').text('0'); return; } $('#noResults').hide(); $('#resultCount').text(dataArray.length); dataArray.forEach(item => { const bancai = item.bancai; const dingdan = item.dingdan; const chanpin = item.chanpin; const zujian = item.zujian; const kucun = item.kucun; const row = ` <tr> <td>${dingdan.number}</td> <td> <div><strong>编号:</strong> ${chanpin.bianhao}</div> <div><strong>名称:</strong> ${chanpin.name}</div> </td> <td>${item.dingdan_chanpin.shuliang}</td> <td>${zujian.name}</td> <td> <div><strong>ID:</strong> ${bancai.id}</div> <div><strong>材质:</strong> ${bancai.caizhi.name}</div> <div><strong>厚度:</strong> ${bancai.houdu}mm</div> <div><strong>木皮1:</strong> ${bancai.mupi1.name}${bancai.mupi1.you ? '(油漆)' : ''}</div> <div><strong>木皮2:</strong> ${bancai.mupi2.name}${bancai.mupi2.you ? '(油漆)' : ''}</div> </td> <td>${item.chanpin_zujian.one_howmany}</td> <td>${item.orderUsage.toFixed(2)}</td> <td class="${kucun.shuliang < item.orderUsage ? 'text-danger fw-bold' : ''}"> ${kucun.shuliang} </td> <td> <div><strong>订单可用:</strong> ${item.orderAvailable}</div> <button class="btn btn-sm btn-outline-primary mt-2 view-detail" data-bancai-id="${bancai.id}"> <i class="bi bi-info-circle"></i> 详情 </button> </td> </tr> `; $tbody.append(row); }); // 绑定详情按钮事件 $('.view-detail').off('click').on('click', function() { const bancaiId = $(this).data('bancai-id'); viewBancaiDetail(bancaiId); }); } // 查看板材详情(添加进货记录显示) function viewBancaiDetail(bancaiId) { const bancai = dataManager.data.bancais.find(b => b.id === bancaiId); if (!bancai) return; const kucun = bancai.kucun; const reservedOrder = kucun.reservedOrder ? kucun.reservedOrder.number : '无'; // 获取该板材的进货记录 const jinhuoRecords = dataManager.data.jinhuos .filter(j => j.dingdan_bancai && j.dingdan_bancai.bancai && j.dingdan_bancai.bancai.id === bancaiId) .map(j => ({ date: new Date(j.date).toLocaleDateString(), shuliang: j.shuliang, user: j.user ? j.user.name : '未知用户', dingdan: j.dingdan_bancai.dingdan ? j.dingdan_bancai.dingdan.number : '无关联订单' })); // 构建详情内容 const detailContent = ` <div class="bancai-detail"> <h5 class="mb-3">板材详情 #${bancai.id}</h5> <div class="row"> <div class="col-md-6"> <div class="mb-2"><strong>材质:</strong> ${bancai.caizhi.name}</div> <div class="mb-2"><strong>厚度:</strong> ${bancai.houdu}mm</div> <div class="mb-2"><strong>木皮1:</strong> ${bancai.mupi1.name}${bancai.mupi1.you ? ' (油漆)' : ''}</div> <div class="mb-2"><strong>木皮2:</strong> ${bancai.mupi2.name}${bancai.mupi2.you ? ' (油漆)' : ''}</div> </div> <div class="col-md-6"> <div class="mb-2"><strong>当前库存:</strong> ${kucun.shuliang}</div> <div class="mb-2"><strong>预定订单:</strong> ${reservedOrder}</div> <div class="mb-2"><strong>库存状态:</strong> <span class="badge ${kucun.shuliang > 50 ? 'bg-success' : kucun.shuliang > 10 ? 'bg-warning' : 'bg-danger'}"> ${kucun.shuliang > 50 ? '充足' : kucun.shuliang > 10 ? '正常' : '不足'} </span> </div> </div> </div> <h6 class="mt-4 border-top pt-3">使用此板材的产品组件</h6> <ul class="list-group"> ${dataManager.data.chanpin_zujians .filter(cz => cz.bancai && cz.bancai.id === bancaiId) .map(cz => `<li class="list-group-item">${cz.zujian.name} (产品: ${cz.chanpin.bianhao})</li>`) .join('')} </ul> <h6 class="mt-4 border-top pt-3">进货记录</h6> <table class="table table-sm"> <thead> <tr> <th>日期</th> <th>数量</th> <th>操作员</th> <th>关联订单</th> </tr> </thead> <tbody> ${jinhuoRecords.length > 0 ? jinhuoRecords.map(j => ` <tr> <td>${j.date}</td> <td>${j.shuliang}</td> <td>${j.user}</td> <td>${j.dingdan}</td> </tr> `).join('') : `<tr><td colspan="4" class="text-center">暂无进货记录</td></tr>` } </tbody> </table> </div> `; // 使用模态框显示详情 $('#materialDetailContent').html(detailContent); const modal = new bootstrap.Modal(document.getElementById('materialDetailModal')); modal.show(); } // 初始化页面(添加错误处理重试逻辑) function intn() { // 显示加载状态 $('#loadingRow').show(); $('#noResults').hide(); try { // 加载数据 await dataManager.fetchAll(); // 更新最后更新时间 $('#lastUpdate').text(new Date().toLocaleTimeString()); // 扁平化数据 const flatData = flattenData(dataManager.data); window.currentFlatData = flatData; // 保存当前数据用于排序过滤 // 更新统计卡片 updateStatistics(dataManager.data); // 渲染表格 renderTable(flatData); // 初始化排序 initSorting(); } catch (error) { console.error('初始化失败:', error); $('#resultBody').html(` <tr> <td colspan="9" class="text-center text-danger py-5"> <i class="bi bi-exclamation-circle fs-1"></i> <h4 class="mt-3">数据加载失败</h4> <p>${error.message || '请检查网络连接后重试'}</p> <button class="btn btn-primary mt-2" id="retryBtn">重试</button> </td> </tr> `); $('#retryBtn').on('click', function() { location.reload(); }); } finally { $('#loadingRow').hide(); } // 绑定搜索事件 $('#orderSearch, #productSearch, #materialSearch, #woodSearch, #thicknessSearch, #minStock, #maxStock').on('input', function() { performSearch(); }); $('#stockStatusBtn').on('click', performSearch); // 重置筛选按钮 $('#resetFilters').on('click', function() { $('#orderSearch, #productSearch, #materialSearch, #woodSearch, #thicknessSearch, #minStock, #maxStock').val(''); performSearch(); }); } // 执行搜索(添加订单可用板材过滤) function performSearch() { if (!window.currentFlatData) return; const filteredData = filterData(window.currentFlatData); renderTable(filteredData); } // 搜索过滤数据(添加订单可用板材过滤) function filterData(flatData) { const orderSearch = $('#orderSearch').val().toLowerCase(); const productSearch = $('#productSearch').val().toLowerCase(); const materialSearch = $('#materialSearch').val().toLowerCase(); const woodSearch = $('#woodSearch').val().toLowerCase(); const thickness = parseFloat($('#thicknessSearch').val()); const minStock = parseInt($('#minStock').val()) || 0; const maxStock = parseInt($('#maxStock').val()) || Infinity; const minAvailable = parseInt($('#minAvailable').val()) || 0; const maxAvailable = parseInt($('#maxAvailable').val()) || Infinity; return flatData.filter(item => { const bancai = item.bancai; const dingdan = item.dingdan; const chanpin = item.chanpin; const kucun = item.kucun; // 订单号搜索 if (orderSearch && !dingdan.number.toLowerCase().includes(orderSearch)) { return false; } // 产品编号搜索 if (productSearch && !chanpin.bianhao.toLowerCase().includes(productSearch)) { return false; } // 板材ID或材质搜索 if (materialSearch && !(bancai.id.toString().includes(materialSearch) || bancai.caizhi.name.toLowerCase().includes(materialSearch))) { return false; } // 木皮搜索 if (woodSearch && !(bancai.mupi1.name.toLowerCase().includes(woodSearch) || bancai.mupi2.name.toLowerCase().includes(woodSearch))) { return false; } // 厚度过滤 if (!isNaN(thickness) && Math.abs(bancai.houdu - thickness) > 0.1) { return false; } // 库存范围过滤 if (kucun.shuliang < minStock || kucun.shuliang > maxStock) { return false; } // 订单可用板材过滤 if (item.orderAvailable < minAvailable || item.orderAvailable > maxAvailable) { return false; } return true; }); } // 初始化排序功能(添加订单可用板材排序) function initSorting() { let currentSort = { column: null, direction: 'asc' }; $('th[data-sort]').on('click', function() { const column = $(this).attr('data-sort'); const $sortIndicator = $(this).find('.sort-indicator'); // 重置其他列的排序指示器 $('.sort-indicator').html(''); // 更新当前排序状态 if (currentSort.column === column) { currentSort.direction = currentSort.direction === 'asc' ? 'desc' : 'asc'; } else { currentSort.column = column; currentSort.direction = 'asc'; } // 更新排序指示器 $sortIndicator.html(currentSort.direction === 'asc' ? '↑' : '↓'); // 执行排序 sortTable(currentSort); }); } // 排序表格数据(添加订单可用板材排序) function sortTable(sortConfig) { const flatData = window.currentFlatData || []; if (flatData.length === 0) return; flatData.sort((a, b) => { let valueA, valueB; switch (sortConfig.column) { case 'dingdan.number': // 订单号 valueA = a.dingdan.number; valueB = b.dingdan.number; break; case 'chanpin.bianhao': // 产品信息 valueA = a.chanpin.bianhao; valueB = b.chanpin.bianhao; break; case 'dingdan_chanpin.shuliang': // 产品数量 valueA = a.dingdan_chanpin.shuliang; valueB = b.dingdan_chanpin.shuliang; break; case 'zujian.name': // 组件 valueA = a.zujian.name; valueB = b.zujian.name; break; case 'bancai.id': // 板材 valueA = a.bancai.id; valueB = b.bancai.id; break; case 'chanpin_zujian.one_howmany': // 单件用量 valueA = a.chanpin_zujian.one_howmany; valueB = b.chanpin_zujian.one_howmany; break; case 'orderUsage': // 订单用量 valueA = a.orderUsage; valueB = b.orderUsage; break; case 'kucun.shuliang': // 库存数量 valueA = a.kucun.shuliang; valueB = b.kucun.shuliang; break; case 'orderAvailable': // 订单可用 valueA = a.orderAvailable; valueB = b.orderAvailable; break; default: return 0; } // 数字排序 if (typeof valueA === 'number') { return sortConfig.direction === 'asc' ? valueA - valueB : valueB - valueA; } // 字符串排序 if (typeof valueA === 'string') { return sortConfig.direction === 'asc' ? valueA.localeCompare(valueB) : valueB.localeCompare(valueA); } return 0; }); // 重新渲染排序后的表格 renderTable(flatData); }
06-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值