登录微信商户平台开通企业微信付款到用户功能。
前置条件(1.公众号申请时间超过90天,2.微信支付有连续30天的流水,30天是连续的,中断一次得重新来。)
1.下载证书。
2.把证书上传至程序文件里面,至于放哪里都可以在使用的时候可以访问就可以,不建议放根目录下面
3.构建参数
$url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; $params["mch_appid"] = 'wx0f68a1ce8xxxxx'; //公众账号appid $params["mchid"] = '1508996531'; //商户号 微信支付平台账号 $params["nonce_str"] = $nonce_str; //随机字符串 $params["partner_trade_no"] = mt_rand(10000000, 99999999); //商户订单号 $params["amount"] = 100; //金额 $params["desc"] = '描述'; //企业付款描述 $params["openid"] = 'ortNx0YZcIiXVJzI5XbMLJpV2MDs'; //用户openid $params["check_name"] = 'NO_CHECK'; //不检验用户姓名 $params['spbill_create_ip'] = $_SERVER['REMOTE_ADDR']; //获取IP
5.生成签名,这个非常坑,一定要放构建参数后面,而且跟微信官方提供的文档里面的生成签名不一样。
$str = 'amount=' . $params["amount"] . '&check_name=' . $params["check_name"] . '&desc=' . $params["desc"] . '&mch_appid=' . $params["mch_appid"] . '&mchid=' . $params["mchid"] . '&nonce_str=' . $params["nonce_str"] . '&openid=' . $params["openid"] . '&partner_trade_no=' . $params["partner_trade_no"] . '&spbill_create_ip=' . $params['spbill_create_ip'] . '&key=shzy9123hdbs612jhxagh7182xxxyhsax61'; //md5加密 转换成大写 $sign = strtoupper(md5($str)); $params["sign"] = $sign; //签名
6.把构建的测试使用函数变成xml格式
$var=$this->arraytoxml($params); //arraytoxml为数组变为xml的函数
7.提交参数。
$xml = $this->curl_post_ssl(' https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers',$var);
8.返回值处理。
function arraytoxml($data){ $str='<xml>'; foreach($data as $k=>$v) { $str.='<'.$k.'>'.$v.'</'.$k.'>'; } $str.='</xml>'; return $str; } public function curl_post_ssl($url, $vars) { $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'); 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; } }
已有 2784 位网友参与,快来吐槽:
发表评论