获取微信用户信息和提现的用户类

本文详细介绍了微信开发中的关键步骤,包括如何检测微信浏览器、获取微信code、access_token及用户信息等。此外,还提供了会员提现的具体实现方法。
    class weixin{
	//1.检测是否微信浏览器
	function isWeiXinBrowser() {
		$agent = $_SERVER ['HTTP_USER_AGENT'];
		if (!strpos($agent, "icroMessenger")){
			return false;
		}
		return true;
	}

	//1.获取微信code
	function get_wx_code($redirect_url,$type='base',$parameter=''){
		$redirect_url =urlencode($redirect_url);
		//1基本信息,其它需要授权,更多高级信息
		$scope = $type == 'base' ? 'snsapi_base' : 'snsapi_userinfo';
		//重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
	   
		//进行重定向操作
		$get_url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='.WX_APPID.'&redirect_uri='.$redirect_url.'&response_type=code&scope='.$scope.'&state='.$parameter;
		header("Location:".$get_url);
		die();
	}

	//2.获取微信access_token,如果是第一次获取,则需要传送_code,否则是从缓存中获取
	function get_wx_access_token($code){
		$get_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.WX_APPID.'&secret='.WX_APPSECRET.'&code='.$code.'&grant_type=authorization_code';
		$response=$this->curl_get($get_url);
		$res_arr=json_decode($response,true);
		return $res_arr;
	}
	
	//2.1
	function get_public_access_token()
	{
		$memcache = new Memcache;
		global $CFG;
		$memcache->connect($CFG['memcache_host'], $CFG['memcache_port']) or die('err_');
		$weixin_access_token='';
		$weixin_access_token_key="weixin_access_token";
		if($memcache->get($weixin_access_token_key))
		{
			$weixin_access_token=$memcache->get($weixin_access_token_key);
		}
		else
		{
			$get_url='https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.WX_APPID.'&secret='.WX_APPSECRET;
			$response=$this->curl_post($get_url);
			$res_arr=json_decode($response,true);
			if(isset($res_arr['access_token']) && isset($res_arr['expires_in']))
			{
				$weixin_access_token=$res_arr['access_token'];
				$memcache->set($weixin_access_token_key,$res_arr['access_token'],false,$res_arr['expires_in']);
			}
			

		}
		$memcache->close();
		return $weixin_access_token;
	}
	
	//2.2.
	function get_wx_userinfo($access_token,$openid)
	{
		$get_url='https://api.weixin.qq.com/cgi-bin/user/info?ACCESS_TOKEN='.$access_token.'&OPENID='.$openid;
		$response=$this->curl_post($get_url);
		$res_arr=json_decode($response,true);
		return $res_arr;
	}
	/**
     * 会员提现
     * @param string $openid 	用户openID
     * @param string $trade_no 	单号
     * @param string $money 	金额
     * @param string $desc 		描述
     * @return string XML 		结构的字符串
     */
	function company_pay_member($openid,$trade_no,$money,$desc){
		global $DT_IP;
		$url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
		$data = array(
			'mch_appid' => WX_OPEN_APPID,
            'mchid'     => WX_MCHID,
            'nonce_str' => random(32),
            'partner_trade_no' => $trade_no, //商户订单号,需要唯一
            'openid'    => $openid,
            'check_name'=> 'NO_CHECK', //NO_CHECK不强制校验真实姓名, FORCE_CHECK:强制
            //'re_user_name' => 'jorsh', //收款人姓名
            'amount'    => $money * 100, //付款金额单位为分
            'desc'      => $desc,
            'spbill_create_ip' => $DT_IP
		);
		$data['sign'] = $this->makeSign($data);
		$xmldata = $this->array2xml($data);
        $res = $this->curl_post($url,$xmldata,true);
		
		$tag=array('status'=>0,'msg'=>'Can t connect the server');
		if(!$res){return $tag;}

		//file_put_contents('D:\EmpireServer\web\info.log',$res,FILE_APPEND);
        $res_arr = $this->xml2array($res);
		if($res_arr['return_code']=='SUCCESS' && $res_arr['result_code']=='SUCCESS')
		{
			$tag['status']=1;
			$tag['res_arr']=$res_arr;
		}
		else
		{
			if(strval($res_arr['return_code']) == 'FAIL'){
				$tag['msg']=strval($res_arr['return_msg']);
				return $tag;
			}
			if(strval($res_arr['result_code']) == 'FAIL'){
				$tag['msg']=strval($res_arr['err_code_des']);
				return $tag;
			}
		}
        return $tag;
	}
	
    //将一个数组转换为 XML 结构的字符串
    function array2xml($arr, $level = 1) {
        $s = $level == 1 ? "<xml>" : '';
        foreach($arr as $tagname => $value) {
            if (is_numeric($tagname)) {
                $tagname = $value['TagName'];
                unset($value['TagName']);
            }
            if(!is_array($value)) {
                $s .= "<{$tagname}>".$value."</{$tagname}>";
            } else {
                $s .= "<{$tagname}>" . $this->array2xml($value, $level + 1)."</{$tagname}>";
            }
        }
        $s = preg_replace("/([\x01-\x08\x0b-\x0c\x0e-\x1f])+/", ' ', $s);
        return $level == 1 ? $s."</xml>" : $s;
    }
	
	//将xml转为array
	function xml2array($xml){   
		//禁止引用外部xml实体
		libxml_disable_entity_loader(true);
		$result= json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);        
		return $result;
	}	
	
	//生成签名
	function makeSign($data){
		$data=array_filter($data);
		ksort($data);
		$str=urldecode(http_build_query($data));
		$sign = strtoupper(md5($str."&key=".WX_APPKEY));
		return $sign;
	}
	
	//crul请求
	function curl_post($url,$xmldata='',$cert=false){
		$curl = curl_init();
		curl_setopt($curl,CURLOPT_TIMEOUT,30);
		curl_setopt($curl,CURLOPT_RETURNTRANSFER, true);
		curl_setopt($curl,CURLOPT_URL,$url);
		curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
		curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,false);
		curl_setopt($curl,CURLOPT_POST,true);
		if($cert)
		{
			curl_setopt($curl,CURLOPT_SSLCERTTYPE,'PEM');
			curl_setopt($curl,CURLOPT_SSLCERT,WX_API_CERT);
			curl_setopt($curl,CURLOPT_SSLKEYTYPE,'PEM');
			curl_setopt($curl,CURLOPT_SSLKEY,WX_API_KEY);
		}
		if($xmldata)
		{
			curl_setopt($curl,CURLOPT_POSTFIELDS,$xmldata);
		}
		$res = curl_exec($curl);
    	curl_close($curl);
   		return $res;
	}
	//crul请求
	function curl_get($url){
		$curl = curl_init();
		curl_setopt($curl,CURLOPT_TIMEOUT,30);
		curl_setopt($curl,CURLOPT_RETURNTRANSFER, true);
		curl_setopt($curl,CURLOPT_URL,$url);
		curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
		curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,false);
		curl_setopt($curl,CURLOPT_POST,false);
		$res = curl_exec($curl);
    	        curl_close($curl);
   		return $res;
	}
	
}

 

### 微信支付分账功能用于用户提现的实现方式 微信支付提供了多种接口来支持复杂的资金流转需求,其中包括分账功能。对于用户提现的需求,可以通过特定的API调用来完成。 #### 添加分账接收方 为了使提现操作合法有效,在执行任何转账之前,必须先通过`profitsharingaddreceiver` API将目标账户设置为有效的分账接收者[^3]: ```http POST https://api.mch.weixin.qq.com/pay/profitsharingaddreceiver HTTP/1.1 Content-Type: application/xml;charset=utf-8 <xml> <mch_appid><![CDATA[wxappid]]></mch_appid> <!-- 商户应用ID --> <mchid><![CDATA[mch_id]]></mchid> <!-- 商户号 --> <sub_mchid><![CDATA[sub_mchid]]></sub_mchid><!-- 子商户号可选 --> <nonce_str><![CDATA[random_string]]></nonce_str> <!-- 随机字符串 --> <sign><![CDATA[SIGNATURE]]></sign> <!-- 签名 --> </xml> ``` 此步骤确保了后续的资金转移能够顺利到达指定用户的账户中。 #### 发起分账请求 当需要向用户发放款项时,则需发起一次完整的分账交易。这通常涉及到创建一个新的订单并指明该笔金额应分配给哪个已注册过的接收对象。具体而言,可以利用`transfers`或者专门针对个人用户的`transfer_to_bank`等API来进行实际打款动作[^2]。 需要注意的是,如果希望模拟“提现”的过程——即让用户主动触发这一行为而非由平台定时结算的话,那么还需要考虑前端交互的设计,比如提供按钮让用户点击确认后提交必要的验证信息(如银行卡号),再经后台审核无误后再启动上述提到的一系列程序化流程[^4]。 ```javascript // 假设这是从前端传来的数据结构 const withdrawRequest = { userId: 'unique_user_identifier', amount: 100, }; function initiateWithdrawal(requestData) { // 这里会有一些业务逻辑判断... const paymentDetails = preparePaymentDetails(requestData); return new Promise((resolve, reject) => { wx.request({ url: '/backend/api/initiate_withdraw', // 后端处理路径 method: 'POST', data: paymentDetails, success(response) { resolve(response.data); }, fail(error) { reject(error); } }); }); } ``` 以上代码片段展示了如何构建一个简单的函数去初始化一笔提现申请,并将其发送至服务器进一步处理。 #### 处理异步通知与状态更新 由于网络环境等因素的影响,即时反馈可能无法立即获得确切的结果。因此建议开发者关注来自微信官方的通知机制,以便及时得知每一步骤的状态变化情况,从而给予用户恰当的信息提示或采取相应的补救措施[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值