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
PHP isset()与empty()的使用区别详解
Aug 29 PHP
理解php原理的opcodes(操作码)
Oct 26 PHP
php下批量挂马和批量清马代码
Feb 27 PHP
php中session_unset与session_destroy的区别分析
Jun 16 PHP
Php Ctemplate引擎开发相关内容
Mar 03 PHP
codeigniter实现get分页的方法
Jul 10 PHP
PHP面向对象程序设计实例分析
Jan 26 PHP
ThinkPHP的常用配置选项汇总
Mar 24 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
Apr 19 PHP
PHP获取文件扩展名的方法实例总结
Jun 10 PHP
详解php与ethereum客户端交互
Apr 28 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版微信发红包接口用法示例
2016/09/23 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
JavaScript用JQuery呼叫Server端方法示例代码
2014/09/03 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
2015/03/02 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
2015/03/03 Javascript
JavaScript从0开始构思表情插件
2016/07/26 Javascript
vue.js中v-on:textInput无法执行事件问题的解决过程
2017/07/12 Javascript
vue移动端轻量级的轮播组件实现代码
2018/07/12 Javascript
微信小程序之判断页面滚动方向的示例代码
2018/08/30 Javascript
webpack4简单入门实例
2018/09/06 Javascript
基于Three.js实现360度全景图片
2018/12/30 Javascript
jquery绑定事件 bind和on的用法与区别分析
2020/05/22 jQuery
JS实现悬浮球只在一侧滑动并且是横屏状态下
2020/08/19 Javascript
JS数组转字符串实现方法解析
2020/09/04 Javascript
原生js 实现表单验证功能
2021/02/08 Javascript
c++生成dll使用python调用dll的方法
2014/01/20 Python
Python利用Beautiful Soup模块创建对象详解
2017/03/27 Python
Python模块结构与布局操作方法实例分析
2017/07/24 Python
Python3简单实例计算同花的概率代码
2017/12/06 Python
Numpy数组转置的两种实现方法
2018/04/17 Python
python查看列的唯一值方法
2018/07/17 Python
对django layer弹窗组件的使用详解
2019/08/31 Python
Python 实现文件读写、坐标寻址、查找替换功能
2019/09/11 Python
Python经纬度坐标转换为距离及角度的实现
2020/11/01 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
Python如何实现感知器的逻辑电路
2020/12/25 Python
HTML5调用手机摄像头拍照的实现思路及代码
2014/06/15 HTML / CSS
比利时买床:Beter Bed
2017/12/06 全球购物
护士毕业生自荐信
2014/02/07 职场文书
毕业生学校推荐信范文
2014/05/21 职场文书
食品安全标语
2014/06/07 职场文书
要账委托书范本
2014/09/15 职场文书
党员民主生活会个人整改措施材料
2014/09/16 职场文书
JavaScript+HTML实现学生信息管理系统
2021/04/20 Javascript
Java实现二维数组和稀疏数组之间的转换
2021/06/27 Java/Android