首页 后端开发 php教程 php实现微信企业付款到零钱

php实现微信企业付款到零钱

Jan 29, 2020 pm 08:29 PM
php 付款 企业 微信

php实现微信企业付款到零钱

我们知道微信支付企业付款到零钱功能应用广泛,比如微信红包奖励,业务结算等。通过企业向个人付款,付款资金将直接进入用户微信零钱。那么我们如何实现这一功能呢?

一、开通条件

899bbeeb6f6942eae3659fd9e84d44b.png

(免费学习视频教程分享:php视频教程

付款资金

企业付款到零钱资金使用商户号余额资金。

根据商户号的账户开通情况,实际出款账户有做区别:

◆ 默认情况下,企业付款到零钱使用商户号基本户(或余额账户)余额。如商户号已开通运营账户,则企业付款到零钱使用运营账户内的资金。

◆ 基本户(或上述其他出款账户)的资金来源,可能是交易结算款项(仅基本户),或给账户充值的资金。当出款账户余额不足时,付款将因余额不足而付款失败。

付款规则

付款方式

◆ 支持API接口或网页操作,付款至目标用户。

收款用户身份指定

◆ 通过APPID+OPENID指定收款用户。

◆ APPID需要为申请商户号时的APPID,或者与商户号有绑定关系。

◆ OPENID的获取方式,可参照:https://developers.weixin.qq.com/doc/offiaccount/User_Management/Get_users_basic_information_UnionID.html#UinonId

付款额度

◆ 不支持给非实名用户打款

◆ 给同一个实名用户付款,单笔单日限额2W/2W

◆ 一个商户同一日付款总额限额100W

注意:以上规则中的限额2w、100w由于计算规则与风控策略的关系,不是完全精确值,金额仅做参考,请不要依赖此金额做系统处理,应以接口实际返回和查询结果为准,请知晓。

收款用户身份校验

◆ 针对付款的目标用户,提供可校验真实姓名的功能

查询付款情况

◆ 已付款的记录,企业可通过企业付款查询查看相应数据,或者查询商户号资金流水。

付款频次

◆ 默认每天最多可向同一个用户付款10次,可以在商户平台--API安全进行设置

其他注意事项

◆ 付款金额必须小于或等于商户当前可用余额的金额;

二、接口地址

接口链接:https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers

请求参数:

具体参看官方企业付款开发文档说明

ecb4c9b69c00b9c58cab3f1463d95de.png

1、基本配置

//公众账号appid
 $data["mch_appid"] = 'appid';
//商户号 
 $data["mchid"] = '';
//随机字符串 
 $data["nonce_str"] = 'suiji'.mt_rand(100,999); 
//商户订单号 
 $data["partner_trade_no"]=date('YmdHis').mt_rand(1000,9999); 
//金额 用户输入的提现金额需要乘以100  
 $data["amount"] = $money; 
//企业付款描述
 $data["desc"] = '企业付款到个人零钱'; 
//用户openid   
 $data["openid"] = $openid; 
//不检验用户姓名  
 $data["check_name"] = 'NO_CHECK'; 
//获取IP  
 $data['spbill_create_ip']=$_SERVER['SERVER_ADDR']; 
//商户密钥 
 $data['key']='';
//商户证书 商户平台的API安全证书下载
 $data['apiclient_cert.pem']
 $data['apiclient_key.pem']
登录后复制

2、php代码

/**
**开始支付
/
 public function userpay(){
 $money = ‘用户输入提现金额';
 $info['money'] = ‘用户余额';
 if ($this->openid && $money){
  if ($money>$info['money'] ){
  echo json_encode([
   'status' => 1,
   'message' => '余额不足,不能提现!',
   'code'=>'余额不足,不能提现!'
  ]);
  }elseif ($money<1){
  echo json_encode([
   &#39;status&#39; => 2,
   &#39;message&#39; => &#39;提现金额不能小于1元&#39;,
   &#39;code&#39;=>&#39;提现金额太低&#39;
  ]);
  }else{
 $openid = $this->openid;
 $trade_no = date(&#39;YmdHis&#39;).mt_rand(1000,9999);
 $res = $this->pay($openid,$trade_no,$money*100,&#39;微信提现&#39;);

 //结果打印
 if($res[&#39;result_code&#39;]=="SUCCESS"){

   echo json_encode([
   &#39;status&#39; => 3,
   &#39;message&#39; => &#39;提现成功!&#39;,
   ]);
  }elseif ($res[&#39;err_code&#39;]=="SENDNUM_LIMIT"){
   echo json_encode([
   &#39;status&#39; => 4,
   &#39;message&#39; => &#39;提现失败!&#39;,
   &#39;code&#39;=>&#39;每日仅能提现一次&#39;,
   ]);
  }else{
   echo json_encode([
   &#39;status&#39; => 5,
   &#39;message&#39; => &#39;提现失败!&#39;,
   &#39;code&#39;=>$res[&#39;err_code&#39;],
   ]);
  }
  }
 }else{
  echo json_encode([
  &#39;status&#39; => 5,
  &#39;message&#39; => &#39;未检测到您当前微信账号~&#39;,

  ]);
 }
 }
登录后复制

支付方法:

/**
*支付方法
/
public function pay($openid,$trade_no,$money,$desc){
 $params["mch_appid"]=&#39;&#39;; 
 $params["mchid"] = &#39;&#39;; 
 $params["nonce_str"]= &#39;suiji&#39;.mt_rand(100,999); 
 $params["partner_trade_no"] = $trade_no;  
 $params["amount"]= $money;  
 $params["desc"]= $desc;  
 $params["openid"]= $openid;  
 $params["check_name"]= &#39;NO_CHECK&#39;; 
 $params[&#39;spbill_create_ip&#39;] = $_SERVER[&#39;SERVER_ADDR&#39;]; 

 //生成签名
 $str = &#39;amount=&#39;.$params["amount"].&#39;&check_name=&#39;.$params["check_name"].&#39;&desc=&#39;.$params["desc"].&#39;&mch_appid=&#39;.$params["mch_appid"].&#39;&mchid=&#39;.$params["mchid"].&#39;&nonce_str=&#39;.$params["nonce_str"].&#39;&openid=&#39;.$params["openid"].&#39;&partner_trade_no=&#39;.$params["partner_trade_no"].&#39;&spbill_create_ip=&#39;.$params[&#39;spbill_create_ip&#39;].&#39;&key=商户密钥&#39;;

 //md5加密 转换成大写
 $sign = strtoupper(md5($str));
 //生成签名
 $params[&#39;sign&#39;] = $sign;

 //构造XML数据
 $xmldata = $this->array_to_xml($params); //数组转XML
 $url=&#39;https://api.mch.weixin.qq.com/mmpaymkttransfers/prom otion/transfers&#39;;

 //发送post请求
 $res = $this->curl_post_ssl($url, $xmldata); //curl请求 
 if(!$res){
 return array(&#39;status&#39;=>1, 
   &#39;msg&#39;=>"服务器连接失败" );
 }

 //付款结果分析
 $content = $this->xml_to_array($res); //xml转数组
 return $content;
 }
登录后复制

curl请求

/**
* curl请求
/
public function curl_post_ssl($url, $xmldata,  $second=30,$aHeader=array()){
 $ch = curl_init();
 //超时时间
 curl_setopt($ch,CURLOPT_TIMEOUT,$second);
 curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
 //这里设置代理,如果有的话
 //curl_setopt($ch,CURLOPT_PROXY, &#39;10.206.30.98&#39;);
 //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
 curl_setopt($ch,CURLOPT_URL,$url);
 curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
 curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);

 //默认格式为PEM,可以注释
 curl_setopt($ch,CURLOPT_SSLCERTTYPE,&#39;PEM&#39;);
//绝对地址可使用 dirname(__DIR__)打印,如果不是绝对地址会报 58 错误
 curl_setopt($ch,CURLOPT_SSLCERT,&#39; 绝对地址/apiclient_cert.pem&#39;);
 curl_setopt($ch,CURLOPT_SSLKEYTYPE,&#39;PEM&#39;);
 curl_setopt($ch,CURLOPT_SSLKEY,&#39;绝对地址/apiclient_key.pem&#39;);
 if( count($aHeader) >= 1 ){
  curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
 }
 curl_setopt($ch,CURLOPT_POST, 1);
 curl_setopt($ch,CURLOPT_POSTFIELDS,$xmldata);
 $data = curl_exec($ch);
 if($data){
 curl_close($ch);
 return $data;
 }
 else {
 $error = curl_errno($ch);
 echo "call faild, errorCode:$error\n";
 die();
 curl_close($ch);
 return false;
 }
 }
登录后复制

生成签名

/**
 * array 转 xml
 * 用于生成签名
*/
public function array_to_xml($arr){
 $xml = "<xml>";
 foreach ($arr as $key => $val) {
 if (is_numeric($val)) {
 $xml .= "<" .$key.">".$val."</".$key.">";
 } else
 $xml .= "<".$key."><![CDATA[".$val."]]></".$key.">";
 }
 $xml .= "</xml>";
 return $xml;
 }

/**
* xml 转化为array
*/
public function xml_to_array($xml){
 //禁止引用外部xml实体
 libxml_disable_entity_loader(true);
 $values = json_decode(json_encode(simplexml_load_string($xml, &#39;SimpleXMLElement&#39;, LIBXML_NOCDATA)), true);
 return $values;
 }
登录后复制

结果如图:

d8c951dba4a737f774e34a9f17d4dfd.png

相关文章教程推荐:php教程

以上是php实现微信企业付款到零钱的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

什么是跨站点伪造(CSRF),您如何在PHP中实施CSRF保护? 什么是跨站点伪造(CSRF),您如何在PHP中实施CSRF保护? Apr 07, 2025 am 12:02 AM

在PHP中可以通过使用不可预测的令牌来有效防范CSRF攻击。具体方法包括:1.生成并在表单中嵌入CSRF令牌;2.在处理请求时验证令牌的有效性。

说明匹配表达式(PHP 8)及其与开关的不同。 说明匹配表达式(PHP 8)及其与开关的不同。 Apr 06, 2025 am 12:03 AM

在PHP8 中,match表达式是一种新的控制结构,用于根据表达式的值返回不同的结果。1)它类似于switch语句,但返回值而非执行语句块。2)match表达式使用严格比较(===),提升了安全性。3)它避免了switch语句中可能的break遗漏问题,增强了代码的简洁性和可读性。

PHP和Python:比较两种流行的编程语言 PHP和Python:比较两种流行的编程语言 Apr 14, 2025 am 12:13 AM

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

H5和小程序与APP的区别 H5和小程序与APP的区别 Apr 06, 2025 am 10:42 AM

H5、小程序和APP的主要区别在于:技术架构:H5基于网页技术,小程序和APP为独立应用程序。体验和功能:H5轻便易用,功能受限;小程序轻量级,交互性好;APP功能强大,体验流畅。兼容性:H5跨平台兼容,小程序和APP受平台限制。开发成本:H5开发成本低,小程序中等,APP最高。适用场景:H5适合信息展示,小程序适合轻量化应用,APP适合复杂功能应用。

PHP的未来:改编和创新 PHP的未来:改编和创新 Apr 11, 2025 am 12:01 AM

PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。

PHP与Python:了解差异 PHP与Python:了解差异 Apr 11, 2025 am 12:15 AM

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

在PHP中解释严格的类型(STRICT_TYPES = 1);)。 在PHP中解释严格的类型(STRICT_TYPES = 1);)。 Apr 07, 2025 am 12:05 AM

PHP中的严格类型通过在文件顶部添加declare(strict_types=1);来启用。1)它强制对函数参数和返回值进行类型检查,防止隐式类型转换。2)使用严格类型可以提高代码的可靠性和可预测性,减少bug,提升可维护性和可读性。

您如何防止班级被扩展或方法在PHP中被覆盖? (最终关键字) 您如何防止班级被扩展或方法在PHP中被覆盖? (最终关键字) Apr 08, 2025 am 12:03 AM

在PHP中,final关键字用于防止类被继承和方法被重写。1)标记类为final时,该类不能被继承。2)标记方法为final时,该方法不能被子类重写。使用final关键字可以确保代码的稳定性和安全性。

See all articles