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配置心得包含MYSQL5乱码解决
Nov 20 PHP
PHP高级OOP技术演示
Aug 27 PHP
php 读取文件乱码问题
Feb 20 PHP
在smarty模板中使用PHP函数的方法
Apr 23 PHP
PHP伪静态Rewrite设置之APACHE篇
Jul 30 PHP
学习php设计模式 php实现工厂模式(factory)
Dec 07 PHP
关于WordPress的SEO优化相关的一些PHP页面脚本技巧
Dec 10 PHP
PHP中类的继承和用法实例分析
May 24 PHP
Yii调试查看执行SQL语句的方法
Jul 15 PHP
thinkPHP5分页功能实现方法分析
Oct 25 PHP
详解php命令注入攻击
Apr 06 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实现多服务器共享SESSION数据的方法
2007/03/16 PHP
TMDPHP 模板引擎使用教程
2012/03/13 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
2017/10/17 PHP
php DES加密算法实例分析
2019/09/18 PHP
用js实现trim()的解决办法
2013/04/16 Javascript
现代 JavaScript 开发编程风格Idiomatic.js指南中文版
2014/05/28 Javascript
浅谈JavaScript中的作用域和闭包问题
2015/07/07 Javascript
两种方法解决javascript url post 特殊字符转义 + &amp; #
2016/04/13 Javascript
JavaScript中String对象的方法介绍
2017/01/04 Javascript
JS中from 表单序列化提交的代码
2017/01/20 Javascript
bootstrap 点击空白处popover弹出框隐藏实例
2018/01/24 Javascript
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
ES10的13个新特性示例(小结)
2019/09/23 Javascript
[04:03]辉夜杯主赛事 12月25日RECAP精彩回顾
2015/12/26 DOTA
python基础教程之类class定义使用方法
2014/02/20 Python
Python批量合并有合并单元格的Excel文件详解
2018/04/05 Python
对django中render()与render_to_response()的区别详解
2018/10/16 Python
Python将8位的图片转为24位的图片实现方法
2018/10/24 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
2018/12/10 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
2020/01/13 Python
对tensorflow 中tile函数的使用详解
2020/02/07 Python
Python安装Bs4的多种方法
2020/11/28 Python
用CSS3实现无限循环的无缝滚动的实例代码
2017/07/04 HTML / CSS
css3边框_动力节点Java学院整理
2017/07/11 HTML / CSS
欧洲最大的品牌水上运动服装和设备在线零售商:Wuituit Outlet
2018/05/05 全球购物
Electrolux伊莱克斯巴西商店:家用电器、小家电和配件
2018/05/23 全球购物
英国婴儿产品专家:Samuel Johnston
2020/04/20 全球购物
this关键字的含义
2015/04/08 面试题
学前教育专业毕业生自荐信
2013/10/03 职场文书
30年同学聚会邀请函
2014/01/25 职场文书
关于母亲节的感言
2014/02/04 职场文书
学生喝酒检讨书
2014/02/06 职场文书
元旦文艺汇演主持词
2014/03/26 职场文书
读《工匠精神》有感:热爱工作,精益求精
2019/12/28 职场文书
15个值得收藏的JavaScript函数
2021/09/15 Javascript
Python matplotlib 利用随机函数生成变化图形
2022/04/26 Python