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中利用XML技术构造远程服务(上)
Oct 09 PHP
也谈php网站在线人数统计
Apr 09 PHP
phpMyadmin 用户权限中英对照
Apr 02 PHP
PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
Dec 07 PHP
深入解析yii权限分级式访问控制的实现(非RBAC法)
Jun 13 PHP
PHP的拦截器实例分析
Nov 03 PHP
PHP创建PowerPoint2007文档的方法
Dec 10 PHP
PHP设计模式之简单投诉页面实例
Feb 24 PHP
Redis在Laravel项目中的应用实例详解
Aug 11 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
May 24 PHP
PHP命名空间namespace及use的简单用法分析
Aug 03 PHP
PHP快速导出百万级数据到CSV或者EXCEL文件
Nov 27 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
C# Assembly类访问程序集信息
2009/06/13 PHP
php遍历目录viewDir函数
2009/12/15 PHP
分享一个php 的异常处理程序
2014/06/22 PHP
php面向对象中static静态属性与方法的内存位置分析
2015/02/08 PHP
mysql查找删除重复数据并只保留一条实例详解
2016/09/24 PHP
php四种定界符详解
2017/02/16 PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
2017/05/04 PHP
PHP echo()函数讲解
2019/02/15 PHP
微信公众平台开发教程②微信端分享功能图文详解
2019/04/10 PHP
javascript 建设银行登陆键盘
2008/06/10 Javascript
javascript 复杂的嵌套环境中输出单引号和双引号
2009/05/26 Javascript
jQuery实用基础超详细介绍
2013/04/11 Javascript
用javascript关闭本窗口不弹出询问框的方法
2014/09/12 Javascript
javascript设计模式之中介者模式Mediator
2014/12/30 Javascript
jQuery老黄历完整实现方法
2015/01/16 Javascript
js实现精确到秒的倒计时效果
2016/05/29 Javascript
Vue封装的可编辑表格插件方法
2018/08/28 Javascript
Vue2.0 v-for filter列表过滤功能的实现
2018/09/07 Javascript
vue头部导航动态点击处理方法
2018/11/02 Javascript
JS获取月的第几周和年的第几周实例代码
2018/12/05 Javascript
在 Vue 中编写 SVG 图标组件的方法
2020/02/24 Javascript
Node.js API详解之 string_decoder用法实例分析
2020/04/29 Javascript
在Vue中使用Viser说明(基于AntV-G2可视化引擎)
2020/10/28 Javascript
Python中使用语句导入模块或包的机制研究
2015/03/30 Python
Python编程之黑板上排列组合,你舍得解开吗
2017/10/30 Python
xadmin使用formfield_for_dbfield函数过滤下拉表单实例
2020/04/07 Python
详解python中的闭包
2020/09/07 Python
浅谈HTML5 Web Worker的使用
2018/01/05 HTML / CSS
欧舒丹澳洲版:L’OCCITANE
2017/07/17 全球购物
安全生产知识竞赛活动总结
2014/07/07 职场文书
学生上课迟到检讨书
2015/01/01 职场文书
高老头读书笔记
2015/06/30 职场文书
Golang 语言控制并发 Goroutine的方法
2021/06/30 Golang
mysql 生成连续日期及变量赋值
2022/03/20 MySQL
Python中非常使用的6种基本变量的操作与技巧
2022/03/22 Python
Spring Bean是如何初始化的详解
2022/03/22 Java/Android