PHP实现微信商户支付企业付款到零钱功能代码实例
本文为大家分享了PHP实现微信商户支付企业付款到零钱的具体代码,供大家参考,具体内容如下
一、开通条件
企业付款为企业提供付款至用户零钱的能力,支持通过API接口付款,或通过微信支付商户平台(pay.weixin.qq.com)网页操作付款。
使用条件
- 商户号(或同主体其他非服务商商户号)已入驻90日
- 商户号(或同主体其他非服务商商户号)有30天连续正常交易
- 登录微信支付商户平台-产品中心,开通企业付款。
具体的可以看微信支付开发文档
二、代码展示
//企业付款到微信零钱,PHP接口调用方法
define("APPID", "wxe062425f740c30d8"); // 商户账号appid
define("MCHID", "10000098"); // 商户号
define("SECRECT_KEY", "453436425252"); //支付密钥签名
define("IP", "xxx.xxx.xx.xx"); //IP /**
* [xmltoarray xml格式转换为数组]
* @param [type] $xml [xml]
* @return [type] [xml 转化为array]
*/
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;
} /**
* [arraytoxml 将数组转换成xml格式(简单方法):]
* @param [type] $data [数组]
* @return [type] [array 转 xml]
*/
function arraytoxml($data){
$str='<xml>';
foreach($data as $k=>$v) {
$str.='<'.$k.'>'.$v.'</'.$k.'>';
}
$str.='</xml>';
return $str;
} /**
* [createNoncestr 生成随机字符串]
* @param integer $length [长度]
* @return [type] [字母大小写加数字]
*/
function createNoncestr($length =32){
$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyz0123456789";
$str =""; for($i=0;$i<$length;$i++){
$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return $str;
} /**
* [curl_post_ssl 发送curl_post数据]
* @param [type] $url [发送地址]
* @param [type] $xmldata [发送文件格式]
* @param [type] $second [设置执行最长秒数]
* @param [type] $aHeader [设置头部]
* @return [type] [description]
*/
function curl_post_ssl($url, $xmldata, $second = 30, $aHeader = array()){
$isdir = $_SERVER['DOCUMENT_ROOT']."/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, $xmldata);//全部数据使用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;
}
} /**
* [sendMoney 企业付款到零钱]
* @param [type] $amount [发送的金额(分)目前发送金额不能少于1元]
* @param [type] $re_openid [发送人的 openid]
* @param string $desc [企业付款描述信息 (必填)]
* @param string $check_name [收款用户姓名 (选填)]
* @return [type] [description]
*/
function sendMoney($amount,$re_openid,$desc='测试',$check_name=''){ $total_amount = (100) * $amount; $data=array(
'mch_appid'=>APPID,//商户账号appid
'mchid'=> MCHID,//商户号
'nonce_str'=>createNoncestr(),//随机字符串
'partner_trade_no'=> date('YmdHis').rand(1000, 9999),//商户订单号
'openid'=> $re_openid,//用户openid
'check_name'=>'NO_CHECK',//校验用户姓名选项,
're_user_name'=> $check_name,//收款用户姓名
'amount'=>$total_amount,//金额
'desc'=> $desc,//企业付款描述信息
'spbill_create_ip'=> IP,//Ip地址
); //生成签名算法
$secrect_key=SECRECT_KEY;///这个就是个API密码。MD5 32位。
$data=array_filter($data);
ksort($data);
$str='';
foreach($data as $k=>$v) {
$str.=$k.'='.$v.'&';
}
$str.='key='.$secrect_key;
$data['sign']=md5($str);
//生成签名算法 $xml=arraytoxml($data); $url='https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; //调用接口
$res=curl_post_ssl($url,$xml);
$return=xmltoarray($res); print_r($return);
//返回来的结果是xml,最后转换成数组
/*
array(9) {
["return_code"]=>
string(7) "SUCCESS"
["return_msg"]=>
array(0) {
}
["mch_appid"]=>
string(18) "wx57676786465544b2a5"
["mchid"]=>
string(10) "143345612"
["nonce_str"]=>
string(32) "iw6TtHdOySMAfS81qcnqXojwUMn8l8mY"
["result_code"]=>
string(7) "SUCCESS"
["partner_trade_no"]=>
string(18) "201807011410504098"
["payment_no"]=>
string(28) "1000018301201807019357038738"
["payment_time"]=>
string(19) "2018-07-01 14:56:35"
}
*/ $responseObj = simplexml_load_string($res, 'SimpleXMLElement', LIBXML_NOCDATA);
echo $res= $responseObj->return_code; //SUCCESS 如果返回来SUCCESS,则发生成功,处理自己的逻辑 return $res;
}
三、调用方法
sendMoney(1,'gdgfdg56456223423','xxxx测试','xxx');
调用的话,稍微在修改下,加上自己的业务逻辑就行了。
四、调用效果


本功能也可以参看如下类文件:wechat_paymentchange.class.php
<?php //企业付款到微信零钱,PHP接口调用方法
define("APPID", "wxe062425f740c30d8"); // 商户账号appid
define("MCHID", "10000098"); // 商户号
define("SECRECT_KEY", "453436425252"); //支付密钥签名
define("IP", "xxx.xxx.xx.xx"); //IP class wechat_paymentchange { /**
* [xmltoarray xml格式转换为数组]
* @param [type] $xml [xml]
* @return [type] [xml 转化为array]
*/
public 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;
} /**
* [arraytoxml 将数组转换成xml格式(简单方法):]
* @param [type] $data [数组]
* @return [type] [array 转 xml]
*/
public function arraytoxml($data){
$str='<xml>';
foreach($data as $k=>$v) {
$str.='<'.$k.'>'.$v.'</'.$k.'>';
}
$str.='</xml>';
return $str;
} /**
* [createNoncestr 生成随机字符串]
* @param integer $length [长度]
* @return [type] [字母大小写加数字]
*/
public function createNoncestr($length =32){
$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyz0123456789";
$str =""; for($i=0;$i<$length;$i++){
$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return $str;
} /**
* [curl_post_ssl 发送curl_post数据]
* @param [type] $url [发送地址]
* @param [type] $xmldata [发送文件格式]
* @param [type] $second [设置执行最长秒数]
* @param [type] $aHeader [设置头部]
* @return [type] [description]
*/
function curl_post_ssl($url, $vars, $second = 30, $aHeader = array()){
$isdir = $_SERVER['DOCUMENT_ROOT']."/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;
}
} /**
* [sendMoney 企业付款到零钱]
* @param [type] $amount [发送的金额(分)目前发送金额不能少于1元]
* @param [type] $re_openid [发送人的 openid]
* @param string $desc [企业付款描述信息 (必填)]
* @param string $check_name [收款用户姓名 (选填)]
* @return [type] [description]
*/
public function sendMoney($amount,$re_openid,$desc='测试',$check_name=''){ $total_amount = (100) * $amount; $data=array(
'mch_appid'=>APPID,//商户账号appid
'mchid'=> MCHID,//商户号
'nonce_str'=>$this->createNoncestr(),//随机字符串
'partner_trade_no'=> date('YmdHis').rand(1000, 9999),//商户订单号
'openid'=> $re_openid,//用户openid
'check_name'=>'NO_CHECK',//校验用户姓名选项,
're_user_name'=> $check_name,//收款用户姓名
'amount'=>$total_amount,//金额
'desc'=> $desc,//企业付款描述信息
'spbill_create_ip'=> IP,//Ip地址
); //生成签名算法
$secrect_key=SECRECT_KEY;///这个就是个API密码。MD5 32位。
$data=array_filter($data);
ksort($data);
$str='';
foreach($data as $k=>$v) {
$str.=$k.'='.$v.'&';
}
$str.='key='.$secrect_key;
$data['sign']=md5($str);
//生成签名算法 $xml=$this->arraytoxml($data); $url='https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; //调用接口
$res=$this->curl_post_ssl($url,$xml);
$return=$this->xmltoarray($res); return $return; print_r($return);
//返回来的结果
// [return_code] => SUCCESS [return_msg] => Array ( ) [mch_appid] => wxd44be6876gg73 [mchid] => 76775512 [nonce_str] => 616615516 [result_code] => SUCCESS [partner_trade_no] => 20186505080216815
// [payment_no] => 1000018361251805057502564679 [payment_time] => 2018-05-15 15:29:50 $responseObj = simplexml_load_string($res, 'SimpleXMLElement', LIBXML_NOCDATA);
echo $res= $responseObj->return_code; //SUCCESS 如果返回来SUCCESS,则发生成功,处理自己的逻辑 return $res;
} } ?>
PHP实现微信开发中提现功能(企业付款到用户零钱)
一.实现该功能目的
这几天在小程序里要实现用户从系统中提现到零钱的功能,查了一下文档可以使用 企业付款到用户零钱 来实现;
官方文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1;
注意事项:商户打款时是从商户可用余额中减钱,所以确保商户可用余额充足,同时注意官方文档中的付款规则;
二.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微信商户支付 - 企业付款到零钱功能(即提现)技术资料汇总
PHP实现微信开发中提现功能(企业付款到用户零钱) 一.实现该功能目的 这几天在小程序里要实现用户从系统中提现到零钱的功能,查了一下文档可以使用 企业付款到用户零钱 来实现: 官方文档:https:/ ...
- PHP微信商户支付企业付款到零钱功能
一 开通条件,就是首先要在微信平台设置好. 以下微信文档里有的,我这里大概掠几项比较重要的. 付款资金 企业付款到零钱资金使用商户号余额资金. 根据商户号的账户开通情况,实际出款账户有做区别: ◆ 默 ...
- PHP实现微信提现(企业付款到零钱)
怎么开通企业付款到零钱? 有的商户号的产品中心是没有这个功能的,不过,该功能的pid(product id)是5,只要随便进去某一个产品,在地址栏把pid改为5. 即可进入该功能页面,进行开通,不过要 ...
- php微信支付企业付款到零钱报错call faild, errorCode:58
这个报错一般是自己证书目录不是绝对目录,正确的目录结构应该是网站根目录下的:“C:\PHPWAMP_IN1\wwwroot\XXXX\XXXX.pem”. 还要注意的是文件夹命名一定 ...
- 解决问题:CA_ERROR证书出错,请登录微信支付商户平台下载证书-企业付款到零钱接口(原创)
这几天用到了微信企业付款到零钱这个接口,结果出现了报错:CA_ERROR, 该接口的API说明和报错提示说明:https://pay.weixin.qq.com/wiki/doc/api/tools/ ...
- php 微信支付企业付款
1.所需参数 字段名 变量名 必填 示例值 类型 描述 公众账号appid mch_appid 是 wx8888888888888888 String 公众号的appId 商户号 mchid 是 19 ...
- JAVA微信企业付款到零钱(十分钟搞定),附完整DEMO下载
最近帮朋友做了一个简单的微分销系统,实现从企业付款到零钱分润的功能,简单记录一下微信企业付款到零钱的开发过程, 主要就是按规则封装好请求参数调用微信接口,涉及一些签名校验: A.接口流程 1. 获取用 ...
- 强开企业付款到零钱与现金红包,无需等待90/30天,2-12H即可强开通!
一.微信官方给出的,企业付款到零钱|现金红包开通的说明 针对入账方式为即时入账至商户号,结算周期为T+1的商户,需满足三个条件:1)入驻满90天,2)连续正常交易30天,3)保持正常健康交易.其余结算 ...
- 微信分账功能与微信支付企业付款相关内容详解(payjs版)
PAYJS开通微信分账功能以来,有很多同学咨询相关情况.很多同学关心有没有什么办法,可以让自己的商户号快速开通企业付款功能.这里就介绍下微信分账的具体相关内容,可以完美解决问题. 一.什么是微信分账? ...
随机推荐
- 好用的UI设计工具
51yuansu 好用的在线画UI图工具 51yuansu.com processon.com processon在线画图工具,程序流程图及UI设计原型图,脑图等 draw.io的PC版画图工 ...
- Visualize Code with Visual Studio
In this post, App Dev Manager Ed Tovsen spotlight the features and benefits of Code Maps in Visual S ...
- git 学习(2) ----- 分支
当我们进行程序开发的过程中,有时会产生一个新的想法,然后就想马上试验,那我们怎么办? 如果我们继续在现有的基础上进行开发,但最后想法不成功,我们还要进行版本回退?如果我们的新想法,需要很长时间才能实现 ...
- json内存级非关系数据库
介绍 `jsonDB2`是一个基于内存的键值对数据库(非关系型数据库) 开发初衷:实现个人tornado项目中内存session存储功能(不想引入redis等非关系型数据库) 项目地址: https: ...
- 04Vue.js路由系统
Vue.js路由系统: https://pizzali.github.io/2018/10/28/Vue.js%E8%B7%AF%E7%94%B1%E7%B3%BB%E7%BB%9F/
- maven转gradle ,windows错误重定向
gradle init --type pom --stacktrace > g.log 2>&1
- kubernetes云平台管理实战:如何创建deployment更好(九)
一.文件创建带--record 1.文件 [root@k8s-master ~]# cat nginx_deploy.yml apiVersion: extensions/v1beta1 kind: ...
- EF CodeFirst系列(8)--- FluentApi配置单个实体
我们已经知道了在OnModelCreating()方法中可以通过FluentApi对所有的实体类进行配置,然而当实体类很多时,我们把所有的配置都放在OnModelCreating()方法中很难维护.E ...
- PWD的编译及调试
实现mypwd 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd Linux命令学习:pwd命令 该命令用来显示目前 ...
- github及git使用
一.github及git Github用于托管和协作项目的网站,git是通常与github一起使用的版本控制系统.Github上有上百万个开源项目,在使用git的时候每个开发人员都在他们的计算机上有一 ...