PHP实现微信提现功能


Posted in PHP onSeptember 30, 2018

本文实例为大家分享了PHP实现微信提现功能的具体代码,供大家参考,具体内容如下

一、实现功能   

这几天在小程序里要实现用户从系统中提现到零钱的功能,查了一下文档可以使用 企业付款到用户零钱 来实现; 

官方文档

注意事项:商户打款时是从商户可用余额中减钱,所以确保商户可用余额充足,同时注意官方文档中的付款规则;

二、PHP实现

//封装提现方法
 function tixian($money){
    $appid = "################";//商户账号appid
    $secret = "##########";//api密码
    $mch_id = "#######";//商户号
    $mch_no = "#######";
    $openid="123456789";//授权用户openid
       
    $arr = array();
    $arr['mch_appid'] = $appid;
    $arr['mchid'] = $mch_id;
    $arr['nonce_str'] = ugv::randomid(20);//随机字符串,不长于32位
    $arr['partner_trade_no'] = '1298016501' . date("Ymd") . rand(10000, 90000) . rand(10000, 90000);//商户订单号
    $arr['openid'] = $openid;
    $arr['check_name'] = 'NO_CHECK';//是否验证用户真实姓名,这里不验证
    $arr['amount'] = $money;//付款金额,单位为分
    $desc = "###提现";
    $arr['desc'] = $desc;//描述信息
    $arr['spbill_create_ip'] = '192.168.0.1';//获取服务器的ip
    //封装的关于签名的算法
    $notify = new Notify_pub();
    $notify->weixin_app_config = array();
    $notify->weixin_app_config['KEY'] = $mch_no;

    $arr['sign'] = $notify->getSign($arr);//签名

    $var = $notify->arrayToXml($arr);
    $xml = $this->curl_post_ssl('https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers', $var, 30, array(), 1);
    $rdata = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
    $return_code = (string)$rdata->return_code;
    $result_code = (string)$rdata->result_code;
    $return_code = trim(strtoupper($return_code));
    $result_code = trim(strtoupper($result_code));

    if ($return_code == 'SUCCESS' && $result_code == 'SUCCESS') {
      $isrr = array(
        'con'=>'ok',
        'error' => 0,
      );
    } else {
      $returnmsg = (string)$rdata->return_msg;
      $isrr = array(
        'error' => 1,
        'errmsg' => $returnmsg,
      );

    }
    return json_encode($isrr);
}
//上个方法中用到的curl_post_ssl()
function curl_post_ssl($url, $vars, $second = 30, $aHeader = array())
  {
    $isdir = "/cert/";//证书位置

    $ch = curl_init();//初始化curl

    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');//CURLOPT_SSLKEY中规定的私钥的加密类型
    curl_setopt($ch, CURLOPT_SSLKEY, $isdir . 'apiclient_key.pem');//证书位置
    curl_setopt($ch, CURLOPT_CAINFO, 'PEM');
    curl_setopt($ch, CURLOPT_CAINFO, $isdir . 'rootca.pem');
    if (count($aHeader) >= 1) {
      curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);//设置头部
    }
    curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
    curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);//全部数据使用HTTP协议中的"POST"操作来发送

    $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;
    }
}

三、补充

关于具体签名算法,可参考微信官方文档;

简单示范签名算法:

//将要发送的数据整理为$data

ksort($data);//排序
//使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串
$str='';
foreach($data as $k=>$v) {
  $str.=$k.'='.$v.'&';
}
//拼接API密钥
$str.='key='.$secrect;
$data['sign']=md5($str);//加密

将数组转换成xml格式(简单方法):

//遍历数组方法
function arraytoxml($data){
  $str='<xml>';
  foreach($data as $k=>$v) {
    $str.='<'.$k.'>'.$v.'</'.$k.'>';
  }
  $str.='</xml>';
  return $str;
}

将xml格式转换为数组:

function xmltoarray($xml) { 
   //禁止引用外部xml实体 
  libxml_disable_entity_loader(true); 
  $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); 
  $val = json_decode(json_encode($xmlstring),true); 
  return $val;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP开发大型项目的一点经验
Oct 09 PHP
PHP4引用文件语句的对比
Oct 09 PHP
php mssql 分页SQL语句优化 持续影响
Apr 26 PHP
UTF8编码内的繁简转换的PHP类
Jul 09 PHP
在PHP中使用反射技术的架构插件使用说明
May 18 PHP
利用php递归实现无限分类 格式化数组的详解
Jun 08 PHP
PHP实现克鲁斯卡尔算法实例解析
Aug 22 PHP
PHP实现无限极分类图文教程
Nov 25 PHP
php绘制一个扇形的方法
Jan 24 PHP
Symfony2实现从数据库获取数据的方法小结
Mar 18 PHP
详解php 使用Callable Closure强制指定回调类型
Oct 26 PHP
Laravel基础_关于view共享数据的示例讲解
Oct 14 PHP
PHP实现微信商户支付企业付款到零钱功能
Sep 30 #PHP
Thinkphp 5.0实现微信企业付款到零钱
Sep 30 #PHP
PHP使用函数用法详解
Sep 30 #PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
Sep 29 #PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
Sep 28 #PHP
PHP从尾到头打印链表实例讲解
Sep 27 #PHP
实现php删除链表中重复的结点
Sep 27 #PHP
You might like
PHP文本数据库的搜索方法
2006/10/09 PHP
PHP4实际应用经验篇(3)
2006/10/09 PHP
攻克CakePHP系列二 表单数据显示
2008/10/22 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
2015/10/09 PHP
PHP自带方法验证邮箱、URL、IP是否合法的函数
2016/12/08 PHP
JavaScript学习笔记之获取当前目录的实现代码
2010/12/14 Javascript
jQuery图片预加载 等比缩放实现代码
2011/10/04 Javascript
你必须知道的Javascript知识点之&quot;深入理解作用域链&quot;的介绍
2013/04/23 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
Jquery中find与each方法用法实例
2015/02/04 Javascript
JavaScript获取网页中第一个图片id的方法
2015/04/03 Javascript
实例代码详解jquery.slides.js
2015/11/16 Javascript
NodeJs的优势和适合开发的程序
2016/08/14 NodeJs
JavaScript reduce和reduceRight详解
2016/10/24 Javascript
node.js 和HTML5开发本地桌面应用程序
2016/12/13 Javascript
Vue实现百度下拉提示搜索功能
2017/06/21 Javascript
JavaScript插入排序算法原理与实现方法示例
2018/08/06 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
2018/12/28 Javascript
JS+php后台实现文件上传功能详解
2019/03/02 Javascript
Angular8基础应用之表单及其验证
2019/08/11 Javascript
javascript之分片上传,断点续传的实际项目实现详解
2019/09/05 Javascript
vue-router 中 meta的用法详解
2019/11/01 Javascript
js实现小时钟效果
2020/03/25 Javascript
[03:04]2018年国际邀请赛典藏宝瓶&莱恩声望物品展示 片尾有彩蛋
2018/06/04 DOTA
Python通过命令开启http.server服务器的方法
2017/11/04 Python
对python调用RPC接口的实例详解
2019/01/03 Python
树莓派+摄像头实现对移动物体的检测
2019/06/22 Python
wxPython修改文本框颜色过程解析
2020/02/14 Python
python实现五子棋程序
2020/04/24 Python
初中生期末考试的自我评价
2013/12/17 职场文书
心碎乌托邦的创业计划书范文
2013/12/26 职场文书
社区志愿者心得体会
2014/01/03 职场文书
建筑设计学生的自我评价
2014/01/16 职场文书
《池塘边的叫声》教学反思
2014/04/12 职场文书
文明城市创建标语
2014/06/16 职场文书
汽车转让协议书范本
2014/12/07 职场文书