微信APP支付提现功能是我们常用的一个功能,接下来我们来对接APP的微信提现
业务范围
1.各类APP的提现功能为用户创造提现收益等
微信支付流程
1.选择接入模式 (商户平台申请)成为普通商户
2.参数申请 开放平台申请APPID ,商户号平台申请mchid
3.绑定APPID及mchid
4.配置API key API v3密钥主要用于平台证书解密、回调信息解密,具体使用方式可参见接口规则文档中证书和回调报文解密章节。请根据以下步骤配置API key:登录
微信商户平台,进入【账户中心 > API安全 > API安全】目录,点击【APIV3密钥】。
5.下载并配置商户证书,商户可登录微信商户平台,在【账户中心】->【API安全】->【API证书】目录下载证书
6.生成证书串
7. 详情可见 APP支付接入准备
tp6框架接入微信提现功能
你好!有很多人在接入微信支付时无从下下手,那么在本篇文件,带你详细的了解并实现微信支付,废话不多说,咱们开始
官方文档(多观察文档,和现成的代码就会发现微信支付的套路其实并不难)
配置
//微信 支付配置
'Wxpay_config' => array (
'appid' => '', //微信开放平台上的应用id
'secret' => '', //微信开放平台上的应用secret
'mch_id' => '', //微信申请成功之后邮件中的商户id
'api_key' => '', //商户秘钥在微信商户平台上自己设定的api密钥 32位
'notify_url' => '', //支付回调地址
'huiyuan_notify' => '' //会员支付回调地址
),```
微信 控制器文件
//在进行请求时必须需要使用证书:cert 与 key 分别属于两个.pem文件
private $SSLCERT_PATH = "/data/wxpay/apiclient_cert.pem"; //微信证书
private $SSLKEY_PATH = "/data/wxpay/apiclient_key.pem"; //商品规格
/*
* 微信提现转付款到零钱
* @access public
* @param string $openid 微信用户openid
* @param string $trade_no 订单号
* @param int $money 金额
* $param string $desc 付款备注
*/
public function wxtransfer($openid,$trade_no,$money,$desc)
{
$data = [
'mch_appid' => config('app.Wxpay_config.appid'),
'mchid' => config('app.Wxpay_config.mch_id'),
'nonce_str' => $this->createNoncestr(),
'partner_trade_no' => $trade_no,
'openid' => $openid,
'check_name' => 'NO_CHECK',
'amount' => $money,
'desc' => $desc,
'spbill_create_ip' => $this->get_client_ip(),
];//请求参数拼凑
$data['sign'] = $this->getSign($data);//sign进行签名
$xmldata = $this->arrayToXml($data);//数组转为xml格式
$url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; //微信付款到零钱提现的地址
$res = $this->postXmlSSLCurl($xmldata,$url); //Curl请求
return $res;
}
/*
生成签名
*/
function getSign($Obj)
{
foreach ($Obj as $k => $v)
{
$Parameters[strtolower($k)] = $v;
}
//签名步骤一:按字典序排序参数
ksort($Parameters);
$String = $this->formatBizQueryParaMap($Parameters, false);
//echo "【string】 =".$String."</br>";
//签名步骤二:在string后加入KEY 在此处替换需要更改的KEY
$String = $String."&key=".config('app.Wxpay_config.api_key');
// echo "<textarea style='width: 50%; height: 150px;'>$String</textarea> <br />";
//签名步骤三:MD5加密
$result_ = strtoupper(md5($String));
return $result_;
}
//数组转xml
function arrayToXml($arr)
{
$xml = "<xml>";
foreach ($arr as $key=>$val)
{
if (is_numeric($val))
{
$xml.="<".$key.">".$val."</".$key.">";
}
else
$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
}
$xml.="</xml>";
return $xml;
}
//将数组转成uri字符串
function formatBizQueryParaMap($paraMap, $urlencode)
{
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v)
{
if($urlencode)
{
$v = urlencode($v);
}
$buff .= strtolower($k) . "=" . $v . "&";
}
$reqPar = '';
if (strlen($buff) > 0)
{
$reqPar = substr($buff, 0, strlen($buff)-1);
}
return $reqPar;
}
//需要使用证书的请求
private function postXmlSSLCurl($xml,$url,$second=30)
{
$ch = curl_init(); //初始化curl
//设置超时时间
curl_setopt($ch,CURLOPT_TIMEOUT,$second);
//这里设置代理,如果有的话
//curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
//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);
//设置header
curl_setopt($ch,CURLOPT_HEADER,FALSE);
//要求结果为字符串且输出到屏幕上
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
//设置证书
//使用证书:cert 与 key 分别属于两个.pem文件
//默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT, $this->SSLCERT_PATH);
//默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY,$this->SSLKEY_PATH);
//post提交方式
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
$data = curl_exec($ch);
//返回结果
if($data){
curl_close($ch);
return $data;
}
else {
$error = curl_errno($ch);
echo "curl出错,错误码:$error"."<br>";
curl_close($ch);
return false;
}
}