php实现金币提现,PHP实现微信提现(企业付款到零钱)

本文详细介绍了如何开通并使用微信企业付款到零钱功能,包括如何在没有此功能的商户号中找到入口,以及提供了一段PHP代码实现用户提现和转账的逻辑。代码中涉及了签名生成、请求参数设置、错误处理等关键步骤,适用于微信支付API的开发者。
摘要由CSDN通过智能技术生成

怎么开通企业付款到零钱?

有的商户号的产品中心是没有这个功能的,不过,该功能的pid(product id)是5,只要随便进去某一个产品,在地址栏把pid改为5。

即可进入该功能页面,进行开通,不过要满足条件。

用户提现代码:

//用户微信提现

private function withdrawals_weixin($id){

$falg = M('withdrawals')->where(['id'=>$id])->find();

$openid = M('users')->where('user_id', $falg['user_id'])->value('openid');

$data['openid'] = $openid;

$data['pay_code'] = $falg['id'].$falg['user_id'];

$data['desc'] = '提现ID'.$falg['id'];

if($falg['taxfee'] >= $falg['money']){

return array('status'=>1, 'msg'=>"提现额度必须大于手续费!" );

}else{

$data['money'] = bcsub($falg['money'], $falg['taxfee'], 2);

}

include_once PLUGIN_PATH . "payment/weixin/weixin.class.php";

$weixin_obj = new \weixin();

$result = $weixin_obj->transfer($data);

return $result;

}

其中pay_code在商户号的提现功能是唯一的,所以为了防重放攻击,这个值千万不能用随机数,最好用ID,具有提现记录唯一。

提现逻辑代码:

// 微信提现转账

function transfer($data){

header("Content-type: text/html; charset=utf-8");

//CA证书及支付信息

$wxchat['appid'] = WxPayConfig::$appid;

$wxchat['mchid'] = WxPayConfig::$mchid;

$wxchat['api_cert'] = PLUGIN_PATH.'/payment/weixin/cert/apiclient_cert.pem';

$wxchat['api_key'] = PLUGIN_PATH.'/payment/weixin/cert/apiclient_key.pem';

// $wxchat['api_ca'] = '/plugins/payment/weixin/cert/rootca.pem';

$webdata = array(

'mch_appid' => $wxchat['appid'],

'mchid' => $wxchat['mchid'],

'nonce_str' => md5(time()),

//'device_info' => '1000',

'partner_trade_no'=> $data['pay_code'], //商户订单号,需要唯一

'openid' => $data['openid'],//转账用户的openid

'check_name'=> 'NO_CHECK', //OPTION_CHECK不强制校验真实姓名, FORCE_CHECK:强制 NO_CHECK:

//'re_user_name' => 'jorsh', //收款人用户姓名

'amount' => $data['money'] * 100, //付款金额单位为分

'desc' => $data['desc'],

'spbill_create_ip' => request()->ip(),

);

foreach ($webdata as $k => $v) {

$tarr[] =$k.'='.$v;

}

sort($tarr);

$sign = implode($tarr, '&');

$sign .= '&key='.WxPayConfig::$key;

$webdata['sign']=strtoupper(md5($sign));

$wget = $this->array2xml($webdata);

$pay_url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';

$res = $this->http_post($pay_url, $wget, $wxchat);

if(!$res){

return array('status'=>1, 'msg'=>"Can't connect the server" );

}

$content = simplexml_load_string($res, 'SimpleXMLElement', LIBXML_NOCDATA);

if(strval($content->return_code) == 'FAIL'){

return array('status'=>1, 'msg'=>strval($content->return_msg));

}

if(strval($content->result_code) == 'FAIL'){

return array('status'=>1, 'msg'=>strval($content->err_code),':'.strval($content->err_code_des));

}

$rdata = array(

'mch_appid' => strval($content->mch_appid),

'mchid' => strval($content->mchid),

'device_info' => strval($content->device_info),

'nonce_str' => strval($content->nonce_str),

'result_code' => strval($content->result_code),

'partner_trade_no' => strval($content->partner_trade_no),

'payment_no' => strval($content->payment_no),

'payment_time' => strval($content->payment_time),

);

return $rdata;

}

其中 PLUGIN_PATH 是一个常量

define('PLUGIN_PATH', __DIR__ . '/plugins/');

定义插件目录

/**

* 将一个数组转换为 XML 结构的字符串

* @param array $arr 要转换的数组

* @param int $level 节点层级, 1 为 Root.

* @return string XML 结构的字符串

*/

function array2xml($arr, $level = 1) {

$s = $level == 1 ? "" : '';

foreach($arr as $tagname => $value) {

if (is_numeric($tagname)) {

$tagname = $value['TagName'];

unset($value['TagName']);

}

if(!is_array($value)) {

$s .= "".(!is_numeric($value) ? '' : '')."{$tagname}>";

} else {

$s .= "" . $this->array2xml($value, $level + 1)."{$tagname}>";

}

}

$s = preg_replace("/([\x01-\x08\x0b-\x0c\x0e-\x1f])+/", ' ', $s);

return $level == 1 ? $s."" : $s;

}

function http_post($url, $param, $wxchat) {

$oCurl = curl_init();

if (stripos($url, "https://") !== FALSE) {

curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);

curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);

}

if (is_string($param)) {

$strPOST = $param;

} else {

$aPOST = array();

foreach ($param as $key => $val) {

$aPOST[] = $key . "=" . urlencode($val);

}

$strPOST = join("&", $aPOST);

}

curl_setopt($oCurl, CURLOPT_URL, $url);

curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($oCurl, CURLOPT_POST, true);

curl_setopt($oCurl, CURLOPT_POSTFIELDS, $strPOST);

if($wxchat){

curl_setopt($oCurl,CURLOPT_SSLCERT,$wxchat['api_cert']);

curl_setopt($oCurl,CURLOPT_SSLKEY,$wxchat['api_key']);

curl_setopt($oCurl,CURLOPT_CAINFO,$wxchat['api_ca']);

}

$sContent = curl_exec($oCurl);

$aStatus = curl_getinfo($oCurl);

curl_close($oCurl);

if (intval($aStatus["http_code"]) == 200) {

return $sContent;

} else {

return false;

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值