微信企业向外出账接口流程

阅读次数: 3,577

  • A+
所属分类:建站

先说我的 环境及需要的参数
系统:server2008R2
web环境:APACHE2.2   php5.4+
需要的微信参数:
1.三个 PEM 秘钥文件
/wx/cert/apiclient_cert.pem    //对应 curl 的 CURLOPT_SSLCERT
/wx/cert/apiclient_key.pem     //对应curl的 CURLOPT_SSLKEY
/wx/cert/rootca.pem         //对应curl的 CURLOPT_CAINFO
三个缺一不可 而且必须是绝对路径 绝对路径 绝对路径 (重要三遍)可以在商户平台下载证书
2.一个 API 的key (登录商户平台查看) 如下图
微信企业向外出账接口流程
3.微信公众号平台里需要设置授权域名为你自己的域名(无需展示自己百度)
4.查看自己公众号的《商户号ID》《APPID》《APPSCRIPT》 三个值

保证 以上的环境和参数无误您就可以走下边的流程了。

第一步: 获取已经关注了自己公众号的用户的 OPENID
1.通过下面url获取code
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=《下一步获取code的地址》&response_type=code&scope=snsapi_base&state=《分销可以用的数据》#wechat_redirect
2.通过code获取用户accesstoken 和 openID
$appid = "APPID";
$appsecret = "appsecret"; //b8613253cce45d00fbd1aeb56fbd5725 //3564b4ba8419790cc0d2f523e0d0a9f9
$code = $_GET["code"];
//var_dump($code);

$get_accessUrl = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$appsecret.'&code='.$_GET['code']."&grant_type=authorization_code";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $get_accessUrl);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
$json_obj = json_decode($output, true);
$json_obj 即我们所得结果
3.有了openID就可以调用出账接口
3.1 整理请求数据为数组
$access_token = $json_obj['access_token'];
$openids = $json_obj['openid'];

$mch_appid=$appid;
$mchid='1351031801';//商户号
$nonce_str='qyzf'.rand(100000, 999999);//随机数
$partner_trade_no='HW'.time().rand(10000, 99999);//商户订单号
$openid=$openids;//用户唯一标识
$check_name='NO_CHECK';//校验用户姓名选项,NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账)OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
$re_user_name='jack';//用户姓名
$amount=100;//金额(以分为单位,必须大于100)
$desc='钓鱼大战!!!';//描述
$spbill_create_ip=$_SERVER["REMOTE_ADDR"];//请求ip
//封装成数据
$dataArr=array();
$dataArr['amount']=$amount;
$dataArr['check_name']=$check_name;
$dataArr['desc']=$desc;
$dataArr['mch_appid']=$mch_appid;
$dataArr['mchid']=$mchid;
$dataArr['nonce_str']=$nonce_str;
$dataArr['openid']=$openid;
$dataArr['partner_trade_no']=$partner_trade_no;
$dataArr['re_user_name']=$re_user_name;
3.2 获取验签 结果 (大写的MD5结果32位) 方法如下
function getSign($Obj){ //$obj 为数组  即 $sign = getSign($dataArr);
var_dump($Obj);//die;
foreach ($Obj as $k => $v)
{
$Parameters[$k] = $v;
}
//签名步骤一:按字典序排序参数
ksort($Parameters);
$String = formatBizQueryParaMap($Parameters, false);
//echo '【string1】'.$String.'</br>';
//签名步骤二:在string后加入KEY 1a44156b7d2d759090ed3508bd3ff589
$String = $String."&key=455a35b0261a0671e7b0a5921b45ab7c";
//echo "【string2】".$String."</br>";
//签名步骤三:MD5加密
$String = md5($String);
//echo "【string3】 ".$String."</br>";
//签名步骤四:所有字符转为大写
$result_ = strtoupper($String);
//echo "【result】 ".$result_."</br>";
return $result_;
}
3.3 有了sign 后就整理好将要发送的XML数据
$data="<xml><mch_appid>".$mch_appid."</mch_appid>
<mchid>".$mchid."</mchid>
<nonce_str>".$nonce_str."</nonce_str>
<partner_trade_no>".$partner_trade_no."</partner_trade_no>
<openid>".$openid."</openid>
<check_name>".$check_name."</check_name>
<re_user_name>".$re_user_name."</re_user_name>
<amount>".$amount."</amount>
<desc>".$desc."</desc>
<spbill_create_ip>".$spbill_create_ip."</spbill_create_ip>
<sign>".$sign."</sign>
</xml>";
3.4 开始通过curl模拟发送
$url ="https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
$return_data = curl_post_ssl($url,$data);
var_dump(xmlToArray($return_data));

其中 curl_post_ssl()方法如下
function curl_post_ssl($url, $vars, $second=30,$aHeader=array()){
//echo '到了访问这里';
$str = file_get_contents('/cert/apiclient_cert.pem');
echo $str;
$ch = curl_init();
//超时时间
curl_setopt($ch,CURLOPT_TIMEOUT,$second);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
//这里设置代理,如果有的话
//curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');
//curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);

//以下两种方式需选择一种
//第一种方法,cert 与 key 分别属于两个.pem文件
curl_setopt($ch,CURLOPT_SSLCERT,$_SERVER['DOCUMENT_ROOT'].'/wx/cert/apiclient_cert.pem');
curl_setopt($ch,CURLOPT_SSLKEY,$_SERVER['DOCUMENT_ROOT'].'/wx/cert/apiclient_key.pem');
curl_setopt($ch,CURLOPT_CAINFO,$_SERVER['DOCUMENT_ROOT'].'/wx/cert/rootca.pem');

//第二种方式,两个文件合成一个.pem文件
//curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem');

if( count($aHeader) >= 1 ){
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
}

curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);
$data = curl_exec($ch);
if($data){
var_dump($data);
curl_close($ch);
return $data;
}
else {
$error = curl_errno($ch);
echo "errorCode:$error\n";
curl_close($ch);
return false;
}
}
xmlToArray()方法如下
function xmlToArray($xml){
return json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
}

至此 查看自己的微信 已经收到 1元的入账信息  成功

转载请注明 原文地址  https://user.qzone.qq.com/997823131/infocenter
神秘剑派--大师兄

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: