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 Smarty初体验二 获取配置信息
Aug 08 PHP
PHP支持多种格式图片上传(支持jpg、png、gif)
Nov 03 PHP
php 对输入信息的进行安全过滤的函数代码
Jun 29 PHP
PHP echo,print,printf,sprintf函数之间的区别与用法详解
Nov 27 PHP
php生成百度sitemap站点地图类函数实例
Oct 17 PHP
php实现的树形结构数据存取类实例
Nov 29 PHP
discuz目录文件资料汇总
Dec 30 PHP
PHP new static 和 new self详解
Feb 19 PHP
yii2中dropDownList实现二级和三级联动写法
Apr 26 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
Oct 02 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
Apr 04 PHP
tp5.1 框架数据库高级查询技巧实例总结
May 25 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
Yii配置文件用法详解
2014/12/04 PHP
php+ajax实现文章自动保存的方法
2014/12/30 PHP
PHP获取页面执行时间的方法(推荐)
2016/12/10 PHP
详解laravel passport OAuth2.0的4种模式
2019/11/04 PHP
使用jQuery和PHP实现类似360功能开关效果
2014/02/12 Javascript
JS实现距离上次刷新已过多少秒示例
2014/05/23 Javascript
详细谈谈AngularJS的子级作用域问题
2016/09/05 Javascript
微信小程序开发之相册选择和拍照详解及实例代码
2017/02/22 Javascript
详细AngularJs4的图片剪裁组件的实例
2017/07/12 Javascript
初学者AngularJS的环境搭建过程
2017/10/27 Javascript
浅谈vue中慎用style的scoped属性
2017/11/28 Javascript
JS实现简单的浮动碰撞效果示例
2017/12/28 Javascript
jQuery实现的点击按钮改变样式功能示例
2018/07/21 jQuery
详解javascript中的Error对象
2019/04/25 Javascript
Node配合WebSocket做多文件下载以及进度回传
2019/11/07 Javascript
解决await在forEach中不起作用的问题
2021/02/25 Javascript
python动态性强类型用法实例
2015/05/09 Python
Windows系统下使用flup搭建Nginx和Python环境的方法
2015/12/25 Python
Python实现压缩与解压gzip大文件的方法
2016/09/18 Python
python 3.5下xadmin的使用及修复源码bug
2017/05/10 Python
python实现年会抽奖程序
2019/01/22 Python
浅谈Python的条件判断语句if/else语句
2019/03/21 Python
通过实例简单了解Python sys.argv[]使用方法
2020/08/04 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
2021/02/01 Python
基于ccs3的timeline时间线实现方法
2020/04/30 HTML / CSS
Tory Burch英国官方网站:美国时尚生活品牌
2017/12/06 全球购物
Bailey帽子官方商店:Bailey Hats
2018/09/25 全球购物
什么是java序列化,如何实现java序列化
2012/11/14 面试题
人力资源管理专业应届生求职信
2013/09/28 职场文书
房地产公司见习自我鉴定
2014/04/28 职场文书
化工操作工岗位职责
2014/04/29 职场文书
精神文明建设先进工作者事迹材料
2014/05/02 职场文书
给老师的保证书怎么写
2015/05/09 职场文书
企业计划生育责任书
2015/05/09 职场文书
浅谈:电影《孔子》观后感(范文)
2019/10/14 职场文书
QT与javascript交互数据的实现
2021/05/26 Javascript