很多做WEB开发的人都知道,现在做WEB,都需要使用第三方比如支付宝、微信等 。拿国内的ecshop来说吧,我们在添加一个支付宝授权登陆、微信授权登陆,支付宝支付、微信支付的时候,都会需要对不同的模块进行频繁的修改,虽然说也有封装部分的接口,但也不能得尽人意。而且如果后续要对接比如PAYPAY支付、GOOGLE支付等其他第三方支付的时候,会显示出我们写的代码的质量是多么的脆弱,好吧,上正题,本文将从登陆开始,来实现系统化的调用。
该文章作者会大概的阐述自定义
首先我们来定个目标变量,假设支付宝=0,微信=1
//定义第三方接口参数注册
$api = array(
0=>array(
‘extend’=>’AlipayApi’, //接口类名
‘useragent’=>’AlipayClient’,//接口识别用户访问类型
),
1=>array(
‘extend’=>’Weixin’,
‘useragent’=>’MicroMessenger’,
),
);
在这里我们定义好了第三方的接口所需要的信息。
一维代表类型,当然也可以自身在数据库中用户表来进行捆绑识别
二维代表实际参数extend表示需要调用的第三方文件类库,useragent是针对HTML5里识别APP的访问类型。
好吧,我们先从访问开始。
用户在进行HTML登陆的时候,当然也可以对接帐号密码登陆,因为我们都是通过$_SESSION来进行;
class LoginAPI{
function getlogin($user_agent,$store_id){
for ($i=0;$i<count($api);$i++){
if (strpos($user_agent,$api[$i][‘useragent’])){
$login = new $api[$i][‘extend’]();
$url = $login->getLoginApi($store_id);
header(“Location:”.$url);
exit();
}
}
die(“<h1>ERROR</h1>”);
}
}
我们在需要使用的地方,直接实例化LoginAPI,调用方法,附加用户的标识,交由脚本执行。
由于作者实际写的系统是针对HTML5为主,授权登陆我们都知道,需要跳转到支付宝、微信的开放平台的接口,执行实现回调URL;
$url = $login->getLoginApi($store_id);
我们来看看目录结果:
/loginapi.php //授权类
/api/alipay.php //支付宝类,包括登陆、支付、模板消息
/api/weixin.php //微信类,包括登陆、支付、模板消息
上文的代码中我们没有看到任何实际性的requirce,因为作者使用的是自己写的框架,里面对常用的接口进行过requcie,虽然浪费资源,但能更快效率的进行实例化调用,而且现在大内存时候,也不用去考虑这一块;
好了,回正题,我们来看看调用的实际登陆
/***
* 支付获取请求的URL
* @return string
*/
function getLoginApi($store_id){
$url=’https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?’;
$url.=’app_id=’.$this->appid;
$url.=’&scope=auth_userinfo’;
$url.=’&redirect_uri=’.HTTP_SERVER.’api/alipay.php’;
$url.=’&state=’.$store_id;
return $url;
}
/***
* 微信获取登陆授权
* @param unknown $store_id
* @return string
*/
public function getLoginApi($store_id){
$url =’https://open.weixin.qq.com/connect/oauth2/authorize?’;
$url.=’appid=’.$this->appid;
$url.=’&redirect_uri=’.HTTP_SERVER.’api/weixin.php’;
$url.=’&response_type=code&scope=snsapi_userinfo’;
$url.=’&state=’.$store_id;
$url.=’#wechat_redirect’;
return $url;
}
这样一来,我们如果要添加京东授权登陆,添加对应的class添加对应的功能,然后统一回调写入数据库即可。
至于添加的时候,需要注册到全局的API里面,以方便在for()里实现调用
如此我们打开支付宝、微信,调用的都是同一个方法名,实现同样的效果,不再需要频繁的写switch(),if()来判断用户的登陆类型了。
下文作者将讲解模块化的支付、回调,代码前瞻:
return $this->pay_class[$this->login_type]->Pay($this->store_id,$this->order_id,$this->store_system,$title,$this->money,$this->customer,$this->return_url);