注意:微信提现之前需要接入微信登录,因为需要用到微信用户的openID,还需要在微信开放平台申请自己的app获得到Appid
一 提现前的准备工作
确认自己的企业资质查看是否符合开通微信企业付款到微信个人用户,查看地址中的场景简绍:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1
Api明确要求我们必须在微信商户平台开通企业付款到个人
二 准备开发相关配置
- 准备请求时要用的证书
(1)证书的准备:java开发需要用到:apiclient_cert.p12证书,PHP的话需要用到apiclient_cert.pem和(apiclient_key.pem) 在微信商户平台(pay.weixin.qq.com)–>账户设置–>API安全–>证书中下载的 。
(2)如果是刚开通的是没有直接下载证书的按钮,下载的这个位置为申请证书需要自己手动申请证书申请的时候会让下载一个证书生成工具如下图
然后通过网页上的证书请求串和软件上的证书串就可以申请到证书文件。
(3)下载到的证书为一个压缩包,其中包含了java需要的证书,php需要的证书,还有都需要用的的密钥。
(4)什么时候会用到证书?与支付不一样,企业支付功能在发送post请求的时候,需要加载自己的一个证书之后,带着证书去请求提现才可以。
(5)证书简绍
2.设置密钥(必须)
在账户中心。Api安全点击设置密钥进行设置,设置的密钥为32位包含数字和字母,密钥是自己填写的和密码一样用什么密码自己决定。
3.设置请求用到的我们自己服务器的IP地址(必须)
这个ip地址一定是要你发送请求的公网ip地址,无论客户端或者服务端。
我的理解是如果前端直接发送请求到微信后台接口,就要用客户端的公网ip,
如果是服务端直接发送请求到微信后台接口,就需要用服务端的公网ip。
而且这个ip地址必需先添加到商户白名单。
添加ip白名单的流程如下:
1.先登陆商户平台
https://pay.weixin.qq.com/index.php
2.到产品中心=》我的产品
3.找到企业付款到零钱点进去
4.进入产品设置
5.在API接口发起添加公网ip
如果没有添加合适的ip白名单,申请提现就会返回如下结果
<err_code><![CDATA[NO_AUTH]]></err_code>
<err_code_des><![CDATA[此IP地址不允许调用接口,如有需要请登录微信支付商户平台更改配置]]></err_code_des>
注:微信企业付款到银行卡同样要添加ip白名单,只是请求参数不需要写明ip地址。
三 处理PHP逻辑
(1)注意事项
(2)请求提现的地址
(3)必填参数的简绍
(4)PHP代码
Php的下半部分根据自己的开发需求修改即可,具体请求之后的错误码相关的参考该链接:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2 到此所有的工作就做完了剩下的就是调试了。
下边附上PHP源码:
<?php
//企业付款到微信零钱,PHP接口调用方法
define("APPID", "appid"); // 商户账号appid
define("MCHID", "商户号"); // 商户号
define("SECRECT_KEY", "支付密钥签名"); //支付密钥签名
define("IP", "192.168.1.1"); //IP
function createNoncestr($length =32)
{
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str ="";
for ( $i = 0; $i < $length; $i++ ) {
$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return $str;
}
function unicode() {
$str = uniqid(mt_rand(),1);
$str=sha1($str);
return md5($str);
}
function arraytoxml($data){
$str='<xml>';
foreach($data as $k=>$v) {
$str.='<'.$k.'>'.$v.'</'.$k.'>';
}
$str.='</xml>';
return $str;
}
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;
}
function curl($param="",$url) {
$isdir = $_SERVER['DOCUMENT_ROOT']."/config/";//证书位置;绝对路径
$postUrl = $url;
$curlPost = $param;
$ch = curl_init(); //初始化curl
curl_setopt($ch, CURLOPT_URL,$postUrl); //抓取指定网页
curl_setopt($ch, CURLOPT_HEADER, 0); //设置header
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_POST, 1); //post提交方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost); // 增加 HTTP Header(头)里的字段
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');
$data = curl_exec($ch); //运行curl
curl_close($ch);
return $data;
}
/*
$amount 发送的金额(分)目前发送金额不能少于1元
$re_openid, 发送人的 openid
$desc // 企业付款描述信息 (必填)
$check_name 收款用户姓名 (选填)
*/
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($xml,$url);
$return=xmltoarray($res);
error_log("sdk_log ===== ".toString($return),0);
if(!array_key_exists("return_code", $return) || $return["return_code"] === "FAIL") {//通信失败
return FALSE;
}
// print_r($return);
//返回来的结果
// [return_code] => SUCCESS [return_msg] => Array ( ) [mch_appid] => wxd44b890e61f72c63 [mchid] => 1493475512 [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 $return["result_code"] === "SUCCESS";
}
/** 优雅输出 */
function toString($array) {
$res = "";
foreach ($array as $key => $value) {
$res = $res .$key." = ".$value." \n";
}
return $res;
}
return 'WeChatWithdraw.php';
?>
(5)到账截图
四 其他
微信支付接口签名校验工具:
https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=20_1
企业付款到个人账户官方文档:
https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2
微信登录官方文档: