注意事项

下预付单时 务必要添加 profit_sharing 为 Y 否则该笔订单不支持分账。 参考链接 https://pay.weixin.qq.com/wiki/doc/api/allocation.php?chapter=26_3
订单支付成功后不能立刻执行分账逻辑 要任务操作 大于订单支付时间1分钟以上 且有QPS限制 建议做好日志警告 必要时切换到服务商分账(服务商分账QPS限制会比普通商户大)
<?phpnamespace app\api\lib\Weixin;use think\Controller;class Weixin extends Controller
{private $sep_url;   // 单次分账请求URLprivate $mch_id;    // 商户号private $appid;     // 公众号appidprivate $mch_secrect;   // 此处是商户key!!!function __construct(){$this->sep_url = 'https://api.mch.weixin.qq.com/secapi/pay/profitsharing';$this->mch_id = config('wechat.pay_config.mch_id');$this->appid = config('wechat.pay_config.app_id');$this->mch_secrect = config('wechat.pay_config.key');}/*** Notes: 请求单次分账* @param string $transaction_id* @param string $out_order_no 商户系统内部的分账单号,在商户系统内部唯一(单次分账、多次分账、完结分账应使用不同的商户分账单号),同一分账单号多次请求等同一次。只能是数字、大小写字母_-|*@* @return array*/function _execSplitAccount($transaction_id, $out_order_no){$receivers = $this->receivers($out_order_no);if ($receivers['code'] == 0) return ['code' => '分账失败!'];$tmp_splitting_data = ['appid' => $this->appid,'mch_id' => $this->mch_id,'nonce_str' => $this->getNonceStr(),'sign_type' => 'HMAC-SHA256','transaction_id' => $transaction_id,'out_order_no' => $out_order_no,'receivers' => $receivers['res']];$tmp_splitting_data['sign'] = $this->makeSign($tmp_splitting_data, $this->mch_secrect);$xml    = $this->arrayToXml($tmp_splitting_data);$do_arr = $this->curlPostSsl($this->sep_url, $xml);$result = $this->xmlToArray($do_arr);return $result;}/*** Notes: 获取随机数* @param int $length* @return string*/private function getNonceStr($length = 32){$chars = "abcdefghijklmnopqrstuvwxyz0123456789";$str = "";for ($i = 0; $i < $length; $i++) {$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);}return $str;}/*** Notes: 获取分账详细列表信息* User: googol* @param string $out_order_no 商户内部的分账单号*/private function receivers($out_order_no){/*CREATE TABLE `split_account_order` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`trade` varchar(32) NOT NULL DEFAULT '' COMMENT '分账单号',`m_id` int(11) NOT NULL DEFAULT '0' COMMENT '机器id',`s_id` int(11) NOT NULL DEFAULT '0' COMMENT '店铺id',`agent_id` int(11) NOT NULL COMMENT '代理id',`account` varchar(64) NOT NULL DEFAULT '' COMMENT '分账接收openid',`agent_type` tinyint(1) NOT NULL DEFAULT '3' COMMENT '0平台 1一级代理 2二级代理',`proportion` int(5) NOT NULL DEFAULT '0' COMMENT '比例',`payment` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '实际付款金额',`shareamount` int(11) NOT NULL DEFAULT '0' COMMENT '分得金额 分',`status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '结算状态 0待分账 1已分账 2分账失败',`cdate` varchar(12) NOT NULL DEFAULT '' COMMENT '日期',`regdate` int(11) NOT NULL COMMENT '时间',`shareddate` int(11) NOT NULL DEFAULT '0' COMMENT '分账时间',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='分账订单';*/$out_order = db('split_account_order')->where(['trade' => $out_order_no, 'status' => 0])->field('payment, account, shareamount')->select();if (!empty($out_order)) {$receivers_arr = [];foreach ($out_order as $key => $val) {$receivers_arr[$key]['type']    = 'PERSONAL_OPENID';$receivers_arr[$key]['account'] = $val['account'];$receivers_arr[$key]['amount']  = $val['shareamount'];$receivers_arr[$key]['description'] = 'payment';}return ['code' => 1, 'res' => json_encode($receivers_arr)];}return ['code' => 0];}/*** Notes: 生成sign* @param array $arr* @param string $secret* @return string*/private function makeSign($arr, $secret){//签名步骤一:按字典序排序参数ksort($arr);$str = $this->to_url_params($arr);//签名步骤二:在str后加入KEY$str = $str . "&key=" . $secret;//签名步骤三:HMAC-SHA256 类型  加密的字符串 key是商户秘钥$str = hash_hmac('sha256', $str, $this->mch_secrect);//签名步骤四:所有字符转为大写$result = strtoupper($str);return $result;}/*** Notes: 数组转字符串* @param array $arr* @return string*/private function to_url_params($arr){$str = "";foreach ($arr as $k => $v) {if (!empty($v) && ($k != 'sign')) {$str .= "$k" . "=" . $v . "&";}}$str = rtrim($str, "&");return $str;}/*** Notes: 数组转XML* @param array $arr* @return string*/private function arrayToXml($arr){$xml = '<?xml version="1.0" encoding="UTF-8"?><xml>';foreach ($arr as $key => $val) {$xml.="<".$key.">$val</".$key.">";}$xml.="</xml>";return $xml;}/*** Notes: XML转数组* @param $xml* @return mixed*/private function xmlToArray($xml){libxml_disable_entity_loader(true);$arr= json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);return $arr;}/*** Notes: POST 请求 此处需要证书* @param string    $url* @param string    $vars* @param int       $second* @param array     $aHeader* @return bool|string*/function curlPostSsl($url, $vars, $second = 30, $aHeader = array()){$isdir = __DIR__ . "/../../../../cert/";    //证书位置$ch = curl_init();curl_setopt($ch, CURLOPT_TIMEOUT, $second);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');curl_setopt($ch, CURLOPT_SSLCERT, $isdir . 'apiclient_cert.pem');curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');curl_setopt($ch, CURLOPT_SSLKEY, $isdir . 'apiclient_key.pem');if (count($aHeader) >= 1) {curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);}curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);$data = curl_exec($ch);if ($data) {curl_close($ch);return $data;} else {$error = curl_errno($ch);echo "call faild, errorCode:$error\n";curl_close($ch);return false;}}}

微信支付普通商户分账-请求单次分账相关推荐

  1. 微信支付服务商分账-请求单次分账

    注意事项 服务商请求单次分账与普通商户请求单次分账的区别.1 下预付单时 务必要添加 profit_sharing 为 Y 否则该笔订单不支持分账. 参考链接 https://pay.weixin.q ...

  2. PHP 实现微信支付 “请求单次分账”

    目录 一.小总结 二.服务层 一.小总结 分账 1:调用分账的订单必须是请求下单中以下参数等于  Y 的订单并且在下单接口中该参数也等于 Y 才能使用分账(可以参考一下PHP JSAPI调起微信支付A ...

  3. 微信支付普通商户分账-添加分账接收方

    微信支付普通商户分账-添加分账接收方 写在前面: 微信官方文档 SIGN值校验检查地址 调试中可能遇到的问题 直接上代码 写在前面: 微信官方文档 https://pay.weixin.qq.com/ ...

  4. 浅析微信支付:商户平台代金券或立减优惠开通、指定用户代金券发放、查询等

    本文是[浅析微信支付]系列文章的第十四篇,主要讲解在如何开通商户平台的代金券或立减优惠功能,商家向指定用户发送代金券,查询发送记录,代金券信息等. 浅析微信支付系列已经更新十四篇了哟-,没有看过的朋友 ...

  5. app端微信支付(二) - 生成预付单

    ​前一篇文章的时序图中说了,app端调用微信支付必须先由后台调用微信后台生成预付单,再构建参数给手机端,而数据的构建要以xml形式,那么看看代码具体实现吧,代码已经精简过了,自己的业务已经除去,精简的 ...

  6. 微信支付报出 商户订单号重复 错误问题

    问题描述: 使用微信支付时,在支付页面,由于用户第一次点击了取消或余额不足等原因,没有进行支付.这时,订单已经生成,订单状态为"待支付",当用户继续支付时,微信报出了"2 ...

  7. 微信支付趟坑之旅之单页面应用

    年初产品引入了微信支付到现在不到半年的时间,一直没有过太大的坑爹经历,自认为微信支付也能hold住了,没想到上周还是被微信支付团队的同学狠狠的摆了一道.在这里留个记录,希望同入此坑的同学能尽快爬上来. ...

  8. 微信支付 - 构建商户订单

    // 微信支付成功 -> 支付中心 -> 吃货平台 // |-> 回调通知的url String payReturnUrl = "http://api.z.xuexi.co ...

  9. 微信小程序踩坑之微信支付提示商户未开通支付权限

    继上次踩坑事件后 我们现在API秘药都是采用数字+小写字母 后面不多久公司就成为了微信服务商 工作起来 效率提高不少 然鹅我今天又踩了一个坑 给客户开通了微信支付客户不给账号给我登录 拿不到里面的一些 ...

最新文章

  1. jupyter怎么调字体_AJ里最低调的系列之一:Air Jordan 3
  2. 自然语言处理数据集免费资源开放(附学习资料)
  3. 记一次Linux系统内存占用较高得排查
  4. orale的tnsping与TCP/IP的ping命令的比较
  5. C++默认构造函数的一点说明
  6. 如何读取FoxPro(dbf)打删除标记的记录
  7. python使用百度语音识别API注意事项
  8. 前端工程师如何摆脱舒适区,持续精进?
  9. 让服务器自动从HG版本库中下载代码
  10. 回顾声智科技助力联想智能音箱MINI亮相CES Asia
  11. 批处理向FTP上传指定属性的文件 批处理增量备份的例子
  12. 信贷风控模型搭建及核心风控模式分类
  13. 如何把python代码翻译成中文-Python:谷歌翻译20次的程序如何实现?
  14. 实现webIM技术小结——websocket IM原理篇
  15. 少年宫计算机室管理制度,少年宫计算机室活动计划](4页)-原创力文档
  16. 程序猿日后规划_保存网页以供日后阅读的最佳方法
  17. 剑指 Offer 58 - II. 左旋转字符串
  18. python 添加半透明水印_怎么利用python给图片添加半透明水印
  19. javaScript获取昨天日期跟今天日期
  20. 期末小结(一). 专业技术

热门文章

  1. 【AI Top30+案例评选】AI聚变,寻找2018年度最佳人工智能应用案例
  2. 考不上本科都是智商有问题?
  3. 翻转课堂说教案计算机,翻转课堂模式下《计算机应用基础》教学设计.doc
  4. DPOS3.0的改进分析
  5. 手机智眼——智慧视觉
  6. 红帽Linux安装ffmpeg
  7. 腾讯 TKE 厉害了!用 eBPF绕过 conntrack 优化K8s Service,性能提升40%
  8. 2020软考信息系统项目管理师_项目管理(下) 视频培训教程-任铄-专题视频课程
  9. WFG测试函数的matlab版本
  10. 科学家首次发现多重宇宙的“切实证据”