支付宝服务窗API接口开发php版本
支付宝服务窗API接口的开发对于许多网站要充值的朋友来讲是非常的重要的,今天我们就一起来看一篇关于php版本的支付宝服务窗API接口的开发例子。
这两天没事要接入支付宝服务窗,看支付宝的DEMO,我的神,我怎么评价好呢?阅读性不是很好,很阻碍简单的开发。所以我就根据提供的API简单的开发了点,接口还有很多不完善,有兴趣的可以自己完善一下,下边我就把代码贴出来,有时间再写如何使用。
<?php
classAlipayService{
/**
-服务接口信息
*/
public$service=null;
/**
-签名信息
*/
public$sign=null;
/**
-签名类型
*/
public$sign_type=null;
/**
-字符集
*/
public$charset=null;
/**
-解析的biz_content数据
*/
public$request=null;
/**
-用户openid
*/
public$from_user_id=null;
/**
-消息类型
*/
public$msg_type=null;
/**
-事件类型
*/
public$event_type=null;
/**
-行为参数
*/
public$action_param=null;
/**
-支付宝用户信息
*/
public$user_info=null;
/**
-文本消息内容
*/
public$text=null;
/**
-图片媒体id
*/
public$media_id=null;
/**
-图片格式
*/
public$format=null;
/**
-是否开启调试
*/
private$debug=false;
/**
-接口类型
*/
private$interface_type=array(
'qrcode'=>'alipay.mobile.public.qrcode.create',
'follow'=>'alipay.mobile.public.follow.list',
'gis_get'=>'alipay.mobile.public.gis.get',
'menu_get'=>'alipay.mobile.public.menu.get',
'menu_add'=>'alipay.mobile.public.menu.add',
'down_media'=>'alipay.mobile.public.multimedia.download',
'menu_update'=>'alipay.mobile.public.menu.update',
'info_query'=>'alipay.mobile.public.info.query',
'info_modify'=>'alipay.mobile.public.info.modify',
'shortlink'=>'alipay.mobile.public.shortlink.create',
'label_add'=>'alipay.mobile.public.label.add',
'label_del'=>'alipay.mobile.public.label.delete',
'label_update'=>'alipay.mobile.public.label.update',
'label_query'=>'alipay.mobile.public.label.query',
'label_user_add'=>'alipay.mobile.public.label.user.add',
'label_user_del'=>'alipay.mobile.public.label.user.delete',
'label_user_query'=>'alipay.mobile.public.label.user.query',
'message_custom'=>'alipay.mobile.public.message.custom.send',
'message_total'=>'alipay.mobile.public.message.total.send',
'message_single'=>'alipay.mobile.public.message.single.send',
'message_label_send'=>'alipay.mobile.public.message.label.send',
);
/**
-私有密钥地址,替换为你自己的
*/
private$private_rsa_key_path='rsa_private_key.pem';
/**
-私有密钥地址,替换为你自己的
*/
private$public_rsa_key_path='rsa_public_key.pem';
/**
-支付宝窗的appid替换成你自己的
*/
private$app_id='2015120200901652';
/**
-开启DEBUG参数
-@paramsbooldebugtrue开启调试false关闭调试
-@authorwiduu<admin@widuu.com>
*/
publicfunction__construct($debug=false){
/*是否开启DEBUG*/
if($debug)$this->debug=true;
}
/**
-获取参数,解析请求参数
-
-@authorwiduu<admin@widuu.com>
*/
publicfunctionget_request(){
if(!emptyempty($_POST)){
//请求的服务接口
$this->service=$_POST['service'];
//获取请求字符集
$this->charset=$_POST['charset'];
//获取请求的biz_content
$request_biz_content=$_POST['biz_content'];
//加密算法
$this->sign_type=$_POST['sign_type'];
//加密字符串
$this->sign=$_POST['sign'];
//如果请求格式不是Utf-8转换格式为Utf-8
if(strtolower($this->charset)!='utf-8'){
$request_biz_content=iconv('GBK','utf-8',$request_biz_content);
}
//解析字符串为xml
$request_xml=@simplexml_load_string($request_biz_content,"SimpleXMLElement",LIBXML_NOCDATA);
//解析为数组
$request_array=json_decode(json_encode($request_xml),true);
$this->request=$request_array;
/*解析*/
$this->analysis($request_array);
if($this->debug)$this->write_log('REQUEST_INFO',var_export($request_array,true));
//默认验证方法
if($this->service=='alipay.service.check'){
$this->verify($_POST);
exit();
}
/*返回结果*/
return$request_array;
}
}
/**
-回复文本内容
-@paramsstringcontent文本数据
-@paramsboolmassture为群发
-@authorwiduu<admin@widuu.com>
*/
publicfunctiontext($content,$mass=false){
$info['text']=array('content'=>$content);
/*组织内容*/
$biz_content=$this->common_response('text',$info,$mass);
/*判断是否为群发*/
if($mass){
$method='message_total';
}else{
$method='message_custom';
}
$sys_params=$this->common_system($method,$biz_content);
$sys_params['sign']=$this->rsa_sign($this->build_query($sys_params));
/*返回结果结果是JSON数据*/
$result=$this->response_post($sys_params);
return$result;
}
/**
-回复图文内容
-@paramsarrayarticles拼接的图文消息数组
-@paramsboolmassture为群发
-@authorwiduu<admin@widuu.com>
*/
publicfunctionarticles($articles,$mass=false){
$info['articles']=array($articles);
/*组织内容*/
$biz_content=$this->common_response('image-text',$info,$mass);
/*判断是否群发*/
if($mass){
$method='message_total';
}else{
$method='message_custom';
}
/*加密参数*/
$sys_params=$this->common_system($method,$biz_content);
/*加密字符*/
$sys_params['sign']=$this->rsa_sign($this->build_query($sys_params));
/*返回结果结果是JSON数据*/
$result=$this->response_post($sys_params);
return$result;
}
/**
-关注事件
-
-@authorwiduu<admin@widuu.com>
*/
publicfunctionis_follow(){
$request=$this->request;
if($request['MsgType']=='event'&&$request['EventType']=='follow'){
returntrue;
}else{
returnfalse;
}
}
/**
-取消关注事件
-
-@authorwiduu<admin@widuu.com>
*/
publicfunctionis_unfollow(){
$request=$this->request;
if($request['MsgType']=='event'&&$request['EventType']=='unfollow'){
returntrue;
}else{
returnfalse;
}
}
/**
-下载用户发来的图片
-@parammedia_idstring图片id
-@paramfilenamestring保存图片地址和名称
-@authorwiduu<admin@widuu.com>
*/
publicfunctiondown_media($media_id,$filename){
$sys_params=$this->common_system('down_media',array('mediaId'=>$media_id));
$sys_params['sign']=$this->rsa_sign($this->build_query($sys_params));
/*返回数据*/
$result=$this->response_post($sys_params,true);
$result=file_put_contents($filename,$result);
if($this->debug){
$this->write_log('SAVE_IMAGE','保存图片'.(string)$result);
}
return$result;
}
/**
-(添加|更新|获取)自定义菜单
-@paramstring$type(add|update|get)
-@paramarray$menu菜单数组,如果是获取菜单可以留空
-@authorwiduu<admin@widuu.com>
*/
publicfunctionmenu($type,$menu=array()){
if(!in_array($type,array('get','update','add'))){
if($this->debug){
$this->write_log('ERROR','菜单操作方法错误');
}
returnfalse;
}
/*拼接接口方法*/
$method='menu_'.$type;
$sys_params=$this->common_system($method,$menu);
/*加密字符串*/
$sys_params['sign']=$this->rsa_sign($this->build_query($sys_params));
/*请求获取结果*/
$result=$this->response_post($sys_params);
/*转义并解析JSON数据*/
$menu_json=json_decode(iconv('GBK','utf-8',$result),true);
/*组织接口信息*/
$interface='alipay_mobile_public_'.$method.'_response';
/*遇到错误返回*/
if($menu_json[$interface]['code']!=200){
if($this->debug){
$this->write_log('GET_MENU_ERROR',$menu_json[$interface]['msg']);
}
returnfalse;
}
/*根据类型不同返回不同的结果*/
if($type=='get'){
return$menu_json[$interface]['menu_content'];
}else{
return$menu_json[$interface]['msg'];
}
}
/**
-POST数据方法
-@paramarrayparams参数数组
-@authorwiduu<admin@widuu.com>
*/
privatefunctionresponse_post($params,$type=false){
//下载媒体和请求网关
if($down){
$url='https://openfile.alipay.com/chat/multimedia.do';
}else{
$url='https://openapi.alipay.com/gateway.do';
}
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,http_build_query($params));
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($ch,CURLOPT_SSLVERSION,CURL_SSLVERSION_TLSv1);
$curl=curl_exec($ch);
curl_close($ch);
return$curl;
}
/**
-拼接回复数据
-@paramstring$type回复类型
-@paramarray$info回复内容
-@parambool$mass是否为群发
-@authorwiduu<admin@widuu.com>
*/
privatefunctioncommon_response($type,$info,$mass=false){
$request=$this->request;
$params=array();
//如果不是群发
if(!$mass)$params['toUserId']=$request['FromUserId'];
$params['msgType']=$type;
$params['createTime']=time();
$content=array_merge($params,$info);
return$content;
}
/**
-拼接加密参数
-@paramstring$interface_type接口类型
-@paramarray$biz_content返回biz_content的数组
-@authorwiduu<admin@widuu.com>
*/
privatefunctioncommon_system($interface_type,$biz_content){
/*接口集合*/
$type=$this->interface_type;
$method=$type[$interface_type];
/*公共参数*/
$params=array(
'method'=>$method,
'charset'=>'UTF-8',
'sign_type'=>'RSA',
'app_id'=>$this->app_id,
'timestamp'=>date('Y-m-dH:i:s',time()),
'version'=>'1.0',
);
/*获取某些接口时没有biz_content参数*/
if(count($biz_content)>0){
$params['biz_content']=json_encode($biz_content);
}
/*返回系统参数*/
return$params;
}
/**
-服务验证
-@paramsarrayparams是自动获的验证信息
-@authorwiduu<admin@widuu.com>
*/
privatefunctionverify($params){
/*参数为空*/
if(emptyempty($params)){
if($this->debug){
$this->write_log('ERROR','验证参数为空');
}
}
/*构建参数,使用字典排序再拼接字符串*/
$query_data=$this->build_query($params);
/*验证信息,有可能php版本BUG不支持验证*/
$verify_result=$this->ras_verify($query_data);
/*返回验证结果*/
if($verify_result){
/*取公有密钥的字符串合并为一行*/
$public_rsa_string=file_get_contents($this->public_rsa_key_path);
$public_rsa_string=str_replace("-----BEGINPUBLICKEY-----","",$public_rsa_string);
$public_rsa_string=str_replace("-----ENDPUBLICKEY-----","",$public_rsa_string);
$public_rsa_string=str_replace("\r","",$public_rsa_string);
$public_rsa_string=str_replace("\n","",$public_rsa_string);
/*构建加密字符串*/
$response_xml="<success>true</success><biz_content>$public_rsa_string</biz_content>";
/*生成验证信息*/
$sign=$this->rsa_sign($response_xml);
/*构建返回数据*/
$response="<?xmlversion=\"1.0\"encoding=\"GBK\"?><alipay><response>$response_xml</response><sign>$sign</sign><sign_type>RSA</sign_type></alipay>";
if($this->debug){
$this->write_log('CHECK_RESPONSE',$response);
}
/*输出返回信息*/
echo$response;
exit();
}else{
if($this->debug){
$this->write_log('ERROR','验证失败');
}
}
}
/**
-拼接为字符串函数
-@paramsarrayparams拼接函数
-@authorwiduu<admin@widuu.com>
*/
privatefunctionbuild_query($params){
/*删除sign字符串*/
unset($params['sign']);
/*字典排序*/
ksort($params);
/*拼接*/
$query_array=array();
foreach($paramsas$k=>$v){
$query_array[]="$k"."="."$v";
}
$query_data=implode("&",$query_array);
/*返回拼接好的字符串*/
return$query_data;
}
/**
-验证加密sign,有些PHP版本不支持,不支持情况直接返回true
-@paramsstringquery_data加密字符串
-@authorwiduu<admin@widuu.com>
*/
privatefunctionras_verify($query_data){
/*读取公钥文件,PEM格式*/
$pubKey=file_get_contents($this->public_rsa_key_path);
/*转换为openssl格式密钥*/
$res=openssl_get_publickey($pubKey);
/*调用openssl内置方法验签*/
$result=(bool)openssl_verify($query_data,base64_decode($this->sign),$res);
/*释放资源*/
openssl_free_key($res);
/*有些PHP版本错误,直接返回true*/
if(strpos(openssl_error_string(),'PEM_read_bio')){
returntrue;
}
/*返回验签结果*/
return$result;
}
/**
-通过私有密钥加密数据
-@paramsstringdata加密数据
-@authorwiduu<admin@widuu.com>
*/
privatefunctionrsa_sign($data){
/*读取私钥*/
$priKey=file_get_contents($this->private_rsa_key_path);
/*转换为openssl格式密钥*/
$res=openssl_get_privatekey($priKey);
/*调用openssl加密*/
openssl_sign($data,$sign,$res);
/*释放资源*/
openssl_free_key($res);
/*Base64加密*/
$sign=base64_encode($sign);
/*返回加密参数*/
return$sign;
}
privatefunctionanalysis($params){
switch($params['MsgType']){
case'image':
$this->media_id=$params['Image']['MediaId'];
$this->format=$params['Image']['Format'];
break;
case'text':
$this->text=$params['Text']['Content'];
break;
case'event':
$this->event_type=$params['EventType'];
$this->action_param=$params['ActionParam'];
break;
default:
break;
}
$this->msg_type=$params['MsgType'];
$this->user_info=json_decode($params['UserInfo'],true);
}
/**
-DEBUG为true时的拼接字符串
-@paramstring$level自定义标识符
-@paramstring$info自定义内容
-@paramstring$log_path自定义日志路径
-@authorwiduu<admin@widuu.com>
*/
publicfunctionwrite_log($level,$info,$log_path=''){
if(emptyempty($log_path)){//phpfensi.com
$log_path=dirname(__FILE__)."/log.txt";
}
file_put_contents($log_path,"[$level]".date("Y-m-dH:i:s")."".$info."\r\n",FILE_APPEND);
}
}
好了以上就是小编为各位整理的一篇关于支付宝服务窗API接口的开发例子,这个有前提条件的就是我们必须要申请一个权限才可以,这个官方可以申请小编就不介绍。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。