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 相关文章推荐
计数器详细设计
Oct 09 PHP
linux下为php添加curl扩展的方法
Jul 29 PHP
解析yii数据库的增删查改
Jun 20 PHP
php curl选项列表(超详细)
Jul 01 PHP
PHP获取表单所有复选框的值的方法
Aug 28 PHP
windows7下php开发环境搭建图文教程
Jan 06 PHP
php计算title标题相似比的方法
Jul 29 PHP
8个必备的PHP功能开发
Oct 02 PHP
最准确的php截取字符串长度函数
Oct 29 PHP
PHP针对字符串开头和结尾的判断方法
Jul 11 PHP
php实现微信企业付款到个人零钱功能
Oct 09 PHP
详解Laravel服务容器的优势
May 29 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
一个阿拉伯数字转中文数字的函数
2006/10/09 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
2013/06/03 PHP
关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解
2013/06/24 PHP
跟我学Laravel之视图 &amp; Response
2014/10/15 PHP
thinkphp3.x中session方法的用法分析
2016/05/20 PHP
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
js 设置选中行的样式的实现代码
2010/05/24 Javascript
jQuery学习笔记(3)--用jquery(插件)实现多选项卡功能
2013/04/08 Javascript
javascript Event对象详解及使用示例
2013/11/22 Javascript
jquery ajax,ashx,json的用法总结
2014/02/12 Javascript
上传图片预览JS脚本 Input file图片预览的实现示例
2014/10/23 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
浅谈JS的基础类型与引用类型
2016/09/13 Javascript
原生js仿淘宝网商品放大镜效果
2017/02/28 Javascript
AngularJS ui-router刷新子页面路由的方法
2018/07/23 Javascript
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
Django查找网站项目根目录和对正则表达式的支持
2015/07/15 Python
python将ansible配置转为json格式实例代码
2017/05/15 Python
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
python2.7实现爬虫网页数据
2018/05/25 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
Python3实现zip分卷压缩过程解析
2019/10/09 Python
python自动化unittest yaml使用过程解析
2020/02/03 Python
Python 没有main函数的原因
2020/07/10 Python
python opencv实现简易画图板
2020/08/27 Python
Python基于unittest实现测试用例执行
2020/11/25 Python
什么是重载?CTS、CLS和CLR分别做何解释
2012/05/06 面试题
Linux内核的同步机制是什么?主要有哪几种内核锁
2013/01/03 面试题
最新党员的自我评价分享
2013/11/04 职场文书
优秀大学生推荐信范文
2013/11/28 职场文书
师范学院毕业生求职信范文
2013/12/26 职场文书
保密工作目标责任书
2014/07/28 职场文书
关于践行三严三实的心得体会
2016/01/05 职场文书
浅谈Python类的单继承相关知识
2021/05/12 Python
Python+pyaudio实现音频控制示例详解
2022/07/23 Python