




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】微信開發(fā)之現(xiàn)金紅包接口如何實(shí)現(xiàn)紅包發(fā)放功能
這篇文章給大家分享的是有關(guān)微信開發(fā)之現(xiàn)金紅包接口如何實(shí)現(xiàn)紅包發(fā)放功能的內(nèi)容。在下覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨在下過(guò)來(lái)看看吧。微信現(xiàn)金紅包接口實(shí)現(xiàn)紅包發(fā)放:一:流程:【流程:微信用戶訪問紅包活動(dòng)頁(yè)面--》后端判斷是否是微信訪問的【否:提示用微信打開連接,是:提示用戶是否授權(quán)允許,獲取其的用戶信息【openID等信息】】--》進(jìn)入紅包活動(dòng)頁(yè)面》用戶點(diǎn)擊領(lǐng)取紅包【判斷是否領(lǐng)取過(guò)紅包】是:【提示已領(lǐng)取過(guò)紅包】否--》后端程序調(diào)用接口發(fā)放紅包--》微信用戶在微信中收到紅包--》打開紅包--》紅包金額會(huì)添加到錢包零錢里--》完成紅包發(fā)放?!慷阂獙?shí)現(xiàn)微信現(xiàn)金紅包接口實(shí)現(xiàn)紅包發(fā)放,首先要符合以下條件:1.用于發(fā)放紅包的微信公眾號(hào)要是服務(wù)類型2.登錄微信公眾平臺(tái)官網(wǎng)后,在公眾平臺(tái)后臺(tái)管理頁(yè)面-開發(fā)者中心頁(yè),點(diǎn)擊“修改配置”按鈕,填寫服務(wù)器地址(URL)、Token和EncodingAESKey,其中URL是開發(fā)者用來(lái)接收微信消息和事件的接口URL。Token可由開發(fā)者可以任意填寫,用作生成簽名(該Token會(huì)和接口URL中包含的Token進(jìn)行比對(duì),從而驗(yàn)證安全性)。EncodingAESKey由開發(fā)者手動(dòng)填寫或隨機(jī)生成,將用作消息體加解密密鑰。3.獲取access_token:公眾號(hào)可以使用AppID和AppSecret調(diào)用本接口來(lái)獲取access_token?!続ppID和AppSecret可在微信公眾平臺(tái)官網(wǎng)-開發(fā)者中心頁(yè)中獲得(需要已經(jīng)成為開發(fā)者,且?guī)ぬ?hào)沒有異常狀態(tài))?!?.微信公眾號(hào)要開通“網(wǎng)頁(yè)授權(quán)接口”用戶獲取用戶基本信息【特別是openID,發(fā)紅包時(shí)用到】5.微信公眾號(hào)的“微信支付“
中的
”商戶號(hào)”要開通微信支付【發(fā)紅包的金額是該支付賬戶扣款】,開通“現(xiàn)金紅包”接口【調(diào)用該接口發(fā)放紅包】。6.登陸”商戶號(hào)”【微信公眾號(hào)分配的商戶號(hào)。第5中有說(shuō)明】在“API安全”中下載PHP版的證書【.pem格式】以上如描述不清楚,請(qǐng)查看微信開發(fā)者文檔里面有詳細(xì)的秒殺。部分代碼如下【其余的請(qǐng)查看附件】:<?php
namespace
RedClient\Controller;
use
Think\Controller;
use
RedClient\Redpack\WeiXinInfo;
use
RedClient\Redpack\Oauth;
use
RedClient\Redpack\SendRedPack;
use
RedClient\Redpack\CreateRedPack;
class
IndexController
extends
Controller
{
public
function
index()
{
$this->isWeixin();//是否是微信打開
if($this->access)
{
$this->display();
}
else
{
$class=new
Oauth();
$class->index('/index.php/Index/oauth');
}
}
//獲取用戶信息
openID
public
function
oauth()
{
$code=isset($_GET['code'])?strip_tags(trim($_GET['code'])):'';
$state=isset($_GET['state'])?strip_tags(trim($_GET['state'])):'';
$class=new
Oauth();
$userInfo=$class->getCode($code,$state);//獲取用戶信息
if(!empty($userInfo['data']))
{
//$model=M('wxuser');
//$result=$model->where('openid
=
"'.$userInfo['data']->openid.'"')->field('openid')->select();
if(empty($result))
{
$userInfo['data']=$this->object2array($userInfo['data']);
$model->data($userInfo['data'])->add();
}
}
$userInfo['data']=$this->object2array($userInfo['data']);
//創(chuàng)建紅包
$class=new
CreateRedPack();
$red=$class->redval();
//發(fā)紅包
$class=new
SendRedPack();
$configs=array(
'send_name'=>'紅包發(fā)送者名稱',//紅包發(fā)送者名稱
're_openid'=>$userInfo['data']['openid'],//接受紅包的用戶,用戶在wxappid下的openid
'total_amount'=>$red,//付款金額,單位分
'total_num'=>'1',//紅包發(fā)放總?cè)藬?shù)
'wishing'=>'紅包祝福語(yǔ)',//紅包祝福語(yǔ)
'client_ip'=>$_SERVER['SERVER_ADDR'],//調(diào)用接口的機(jī)器Ip地址
'act_name'=>'活動(dòng)名稱',//活動(dòng)名稱
'remark'=>'備注信息',//
備注信息
);
$class->setFields($configs);
$result=$class->requestXml();
//微信返回信息處理
if(strtoupper($result['return_code'])=='SUCCESS')
{
if(strtoupper($result['result_code'])=='SUCCESS')
{
//紅包發(fā)送成功!
$datas['flag']=1;
echo
$result['err_code_des'];
}
else
{
//紅包發(fā)送失敗
$datas['flag']=0;
$datas['msg']=$result['err_code_des'];
echo
$result['err_code_des'];
}
}
else
{
//紅包發(fā)送失敗
$datas['flag']=0;
$datas['msg']=$result['err_code_des'];
echo
$result['err_code_des'];
}
}
public
function
isWeixin()
{
if
(strpos($_SERVER['HTTP_USER_AGENT'],
'MicroMessenger')
!==
false)
{
$this->access=true;
}
return
false;
}
//類轉(zhuǎn)換成數(shù)組
public
function
object2array($object)
{
if
(is_object($object))
{
foreach
($object
as
$key
=>
$value)
{
$array[$key]
=
$value;
}
}
else
{
$array
=
$object;
}
return
$array;
}
}
?><?php
namespace
RedClient\Redpack;
/**
簡(jiǎn)單紅包算法類
**/
class
CreateRedPack
{
private
$rid=0;//當(dāng)前紅包隨機(jī)數(shù)
private
$rand_arr=array();//35%是1.0到1.1
紅包隨機(jī)數(shù)
private
$rand_arr1=array();//35%是1.1到1.2
紅包隨機(jī)數(shù)
private
$rand_arr2=array();//30%是1.2到1.95
紅包隨機(jī)數(shù)
private
$red=0;//紅包金額
private
$simplered=0;
private
$red_config=array(
array('min'=>1.0,'max'=>1.1),
array('min'=>1.1,'max'=>1.2),
array('min'=>1.2,'max'=>1.95)
);
public
function
__construct()
{
$this->rid=mt_rand(1,10000);//當(dāng)前紅包隨機(jī)數(shù)
$this->rand_arr=range(1,3500);//35%是1.0到1.1
$this->rand_arr1=range(3501,7000);//35%是1.1到1.2
$this->rand_arr2=range(7001,10000);//30%是1.2到1.95
$this->simplered=666;
}
public
function
redval()
{
$maxrp=$this->maxred();//隨機(jī)最大紅包金額
if($maxrp!=$this->simplered)
{
if(in_array($this->rid,$this->rand_arr))
{
$red_val=$this->red_config[0];
$min=$red_val['min']*100;
$max=$red_val['max']*100;
$this->red=mt_rand($min,$max);
$this->red=$this->red/100;
}
elseif(in_array($this->rid,$this->rand_arr1))
{
$red_val=$this->red_config[1];
$min=$red_val['min']*100;
$max=$red_val['max']*100;
$red=mt_rand($min,$max);
$this->red=$this->red/100;
}
elseif(in_array($this->rid,$this->rand_arr2))
{
$red_val=$this->red_config[2];
$min=$red_val['min']*100;
$max=$red_val['max']*100;
$this->red=mt_rand($min,$max);
$this->red=$this->red/100;
}
}
else
{
$this->red=$maxrp;
}
return
$this->red?$this->red:1;
}
protected
function
maxred()
{
$rid=mt_rand(1,100000);
$rid1=mt_rand(1,100000);
$red=0;
$dff=$rid-$rid1;
if($dff
>
0)
{
if(($rid1%$rid1)==$this->simplered)
{
$red=$this->simplered;
}
}
else
{
if(($rid1%$rid)==$this->simplered)
{
$red=$this->simplered;
}
}
return
$red;
}
}
?><?php
namespace
RedClient\Redpack;
/*********
先在公共平臺(tái)配置授權(quán)的域名;
然后才能通過(guò),
網(wǎng)頁(yè)授權(quán)方式獲取微信用戶基本信息
網(wǎng)頁(yè)授權(quán)流程分為四步:
1.引導(dǎo)用戶進(jìn)入授權(quán)頁(yè)面同意授權(quán),獲取code
2.通過(guò)code換取網(wǎng)頁(yè)授權(quán)access_token(與基礎(chǔ)支持中的access_token不同)
3.如果需要,開發(fā)者可以刷新網(wǎng)頁(yè)授權(quán)access_token,避免過(guò)期
4.通過(guò)網(wǎng)頁(yè)授權(quán)access_token和openid獲取用戶基本信息
**********/
class
Oauth
{
protected
$appid='';
protected
$redirect_uri='';
protected
$state='';//mt_rand(100,999);
protected
$appsecret='';
protected
$data=array('flag'=>0,'msg'=>'','data'=>'');
public
function
__construct()
{
$this->appid='appid';//
$this->appsecret='secret';//;
$this->state=mt_rand(100,999);
}
//引導(dǎo)用戶訪問鏈接處理函數(shù)
public
function
index($redirect_uri)
{
$this->redirect_uri=urlencode($redirect_uri);//微信自動(dòng)跳轉(zhuǎn)到$redirect_uri
header('location:/connect/oauth3/authorize?appid='.$this->appid.'&redirect_uri='.$this->redirect_uri.'/oauth.php&response_type=code&scope=snsapi_userinfo&state='.$this->state.'&connect_redirect=1#wechat_redirect');
}
public
function
getCode($code='',$state='',$token='',$webToken='')
{
$data=array(
'errorno'=>'',
'errormsg'=>'',
'data'=>''
);
if(empty($code))
{
$this->data['flag']=0;
$this->data['msg']='授權(quán)失?。?;
}
else
{
/*
1獲取webtoken
2獲取reflash_token
3獲取用戶信息
*/
$token_url
=
'/sns/oauth3/access_token?appid='.$this->appid.'&secret='.$this->appsecret.'&code='.$code.'&grant_type=authorization_code';
$token
=
json_decode(file_get_contents($token_url));
if
(isset($token->errcode))
{
$data['errorno']=$token->errcode;
$data['errormsg']=$token->errmsg;
}
else
{
$access_token_url
=
'/sns/oauth3/refresh_token?appid='.$this->appid.'&grant_type=refresh_token&refresh_token='.$token->refresh_token;
//轉(zhuǎn)成對(duì)象
$accessToken
=
json_decode(file_get_contents($access_token_url));
if
(isset($accessToken->errcode))
{
$data['errorno']=$token->errcode;
$data['errormsg']=$token->errmsg;
}
else
{
$user_info_url
=
'/sns/userinfo?access_token='.$accessToken->access_token.'&openid='.$accessToken->openid.'&lang=zh_CN';
//轉(zhuǎn)成對(duì)象
$userInfo
=
json_decode(file_get_contents($user_info_url));
if
(isset($userInfo->errcode))
{
$data['errorno']=$token->errcode;
$data['errormsg']=$token->errmsg;
}
else
{
$data['data']=$userInfo;
}
}
}
}
return
$data;
}
}
?><?php
/******
用于企業(yè)向微信用戶個(gè)人發(fā)現(xiàn)金紅包
目前支持向指定微信用戶的openid發(fā)放指定金額紅包。
(獲取openid參見微信公眾平臺(tái)開發(fā)者文檔:
網(wǎng)頁(yè)授權(quán)獲取用戶基本信息)
****/
namespace
RedClient\Redpack;
class
SendRedPack
{
private
$config=array(
'nonce_str'=>'',//隨機(jī)字符串,不長(zhǎng)于32位
'sign'=>'',//簽名
'mch_billno'=>'',//商戶訂單號(hào)
'mch_id'=>'1111sdfsafsaddf',//微信支付分配的商戶號(hào)
'wxappid'=>'sddafdsadfdsafdsdd',//微信分配的公眾賬號(hào)ID
'send_name'=>'',//紅包發(fā)送者名稱
're_openid'=>'',//接受紅包的用戶,用戶在wxappid下的openid
'total_amount'=>'',//付款金額,單位分
'total_num'=>'',//紅包發(fā)放總?cè)藬?shù)
'wishing'=>'',//紅包祝福語(yǔ)
'client_ip'=>'',//調(diào)用接口的機(jī)器Ip地址
'act_name'=>'',//活動(dòng)名稱
'remark'=>'',//
備注信息
);
protected
$key='';
protected
$url='/mmpaymkttransfers/sendredpack';
protected
$requestXml='';
//設(shè)置必要參數(shù)
public
function
setFields($conf=array())
{
foreach($conf
as
$k=>$v)
{
if(isset($this->config[$k])
&&
!empty($v))
{
$this->config[$k]=$v;
}
}
$this->config['mch_billno']=$this->billno();
$this->config['nonce_str']=$this->createNonceStr();
$this->createSign($conf);
$this->createXml();
//echo
$this->requestXml;
}
protected
function
billno()
{
return
$this->config['mch_id'].time().md5(mt_rand(1000,9999));
}
/*
//檢查必要參數(shù)是否為空!
public
function
checkConfig()
{
$flag=true;
foreach($this->config
as
$k=>$v)
{
if(empty($v))
{
$flag=false;
break;
}
}
}
*/
//隨機(jī)字符串,不長(zhǎng)于32位
public
function
createNonceStr(
$len=32
)
{
$strs
=
"abcdefghijklmnopqrstuvwxyz0123456789";
$str
="";
$len=$len<=32?$len:32;
for
(
$i
=
0;
$i
<
$len;
$i++
)
{
$str.=
substr($strs,
mt_rand(0,
strlen($strs)-1),
1);
}
return
$str;
}
//格式化參數(shù)
public
function
formatParam($config=array(),$flag=1)
{
$format='';
if(!empty($config))
{
ksort($config);
foreach($config
as
$k=>$v)
{
if($flag)
{
$v=urlencode($v);
}
if($flag==0
&&
strtolower($k)=='sign')
{
continue;
}
$format.=$k.'='.$v.'&';
}
$format=trim($format,'&');
}
return
$format;
}
//創(chuàng)建SIGNATURE
protected
function
createSign($config)
{
$format=$this->formatParam($config,0);
$format.='&key='.$this->key;
$signature=strtoupper(md5($format));
$this->config['sign']=$signature;
return
true;//$signature;
}
//創(chuàng)建xml格式數(shù)據(jù)
protected
function
createXml()
{
$xml='<xml>';
foreach($this->config
as
$k=>$v)
{
if(!empty($v))
{
$xml.='<'.$k.'><![CDATA['.$v.']]></'.$k.'>';
}
}
$xml.='</xml>';
$this->requestXml=$xml;
}
//XML格式數(shù)據(jù)轉(zhuǎn)換為數(shù)組
public
function
createArray($xml='')
{
$arr
=
json_decode(json_encode(simplexml_load_string($xml,
'SimpleXMLElement',
LIBXML_NOCDATA)),
true);
return
$arr;
}
//發(fā)送紅包
public
function
requestXml($timeout=30,$header=array())
{
$ch
=
curl_init();
//超時(shí)時(shí)間
curl_setopt($ch,CURLOPT_TIMEOUT,$timeout);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,
1);
curl_setopt($ch,CURLOPT_URL,$this->url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
//默認(rèn)格式為PEM,可以注釋
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT,dirname(__FILE__).'/apiclient_cert.pem');//pem證書地址
//默認(rèn)格式為PEM,可以注釋
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY,dirname(__FILE__).'/apiclient_key.pem');//key證書地址
curl_setopt($ch,CURLOPT_CAINFO,'PEM');
curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).'/rootca.pem');//CA證書地址
//兩個(gè)文件合成一個(gè).pem文件
//curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem');
if(
count($header)
>=
1
)
{
curl_setopt($ch,
CURLOPT_HTTPHEADER,
$header);
}
curl_setopt($ch,CURLOPT_POST,
1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$this->requestXml);
$data
=
curl_exec($ch);
var_dump($data);
if($data)
{
curl_close($ch);
var_dump($data);
return
$data;
}
else
{
$error
=
curl_errno($ch);
echo
'ERROR:'.$error;
curl_close($ch);
return
false;
}
}
//返回非空值,非NULL
public
function
notEmpty($val='')
{
$return='';
if(null
!=$val
&&
strlen($val)
!=
0)
{
$return=$val;
}
return
$return?$return:false;
}
}
?><?php
namespace
RedClient\Redpack;
class
WeiXinInfo
{
private
$AppID='appid';
private
$AppSecret='secret';
private
$grant_type='client_credential';
private
$url='/cgi-bin/token';
public
function
__construct()
{
//$arr=array('access_token'=>'1','expires'=>'7200');
}
//設(shè)置獲取ACCESSTOKEN
的URL
public
function
setUrl()
{
return
$this->url=$this->url.'?grant_type='.$this->grant_type.'&appid='.$this->AppID.'&secret='.$this->AppSecret;
}
//獲取APPID,SECRET
public
function
getAppid()
{
$sql='select
appid,secret
from
ly_appid
where
flag=1';
$model=M();
$result=$model->query($sql);
if(!empty($result))
{
$this->AppID=$result[0]['appid'];
$this->AppSecret=$result[0]['secret'];
return
$result[0];
}
}
public
function
object2array($object)
{
if
(is_object($object))
{
foreach
($object
as
$key
=>
$value)
{
$array[$key]
=
$value;
}
}
else
{
$array
=
$object;
}
return
$array;
}
//檢驗(yàn)URL有效
public
function
checkUrl()
{
$signature=isset($_GET['signature'])?strip_tags(trim($_GET['signature'])):'';
$timestamp=isset($_GET['timestamp'])?strip_tags(trim($_GET['timestamp'])):'';
$nonce=isset($_GET['nonce'])?strip_tags(trim($_GET['nonce'])):'';
$echostr=isset($_GET['echostr'])?$_GET['echostr']:'';
if(!empty($signature)
&&
!empty($timestamp)
&&
!empty($nonce))
{
if($this->checkSign($signature,$timestamp,$nonce))
{
echo
$echostr;
return
true;
}
else
{
return
false;
}
}
}
//驗(yàn)證SIGNATURE是否有效
private
function
checkSign($sign,$timestamp,$nonce)
{
$token=$this->getAccessToken();
//$token=$this->object2array($token);
$sign_arr=array($token,$timstamp,$nonce);
sort($sign_arr,SORT_STRING);
$signStr=implode($sign_arr);
$signStr=sha1($signStr);
if(strtoupper($signStr)==strtoupper($sign))
{
return
true;
}
return
false;
}
//通過(guò)微信接口獲取微信Access_Token
public
function
getAccessToken()
{
$token='';
$this->setUrl();
$check=$this->checkToken();
if(session('?'.md5('getaccesstoken'))
&&
$check)
{
$tokens=session(md5('getaccesstoken'));
$token=$tokens->access_token;
}
else
{
$result=file_get_contents($this->url);
$result=json_decode($result);
$token=$result->access_token;
$result->expires_in=$result->expires_in+time();
session(md5('getaccesstoken'),$result);
}
return
$token;
}
//檢查微信ACCESS_TOKEN是否有效
public
function
checkToken()
{
if(session('?'.md5('getaccesstoken'))
&&
session(md5('getaccesstoken')))
{
$time=time();
$token=session(md5('getaccesstoken'));
if($token->expires_in-$time
>
30)
{
return
true;
}
else
{
session(md5('getaccesstoken'),null);
}
}
return
false;
}
//保存微信ACCESSTOKEN到數(shù)據(jù)庫(kù)
public
function
saveAccessToken()
{
$token=$this->getAccessToken();
$sql='select
`id`,`rate`,token,ex_time,createtime
from
ly_token
where
token="'.$token.'"
where
appid="'.$this->AppID.'"
AND
secret="'.$this->AppSecret.'"';
$model=M();
$result=$model->query($sql);
if(!empty($result))
{
$time=time();
$expires=$time-$result[0]['createtime'];
if($result[0]['ex_time']-$expires
>
0)
{
return
$result[0]['token'];
}
else
{
$token=$this->getAccessToken();
if(!empty($token))
{
$token=json_decode($token);
if(!isset($token['errcode'])
or
!$token['errcode'])
{
if(isset($token['access_token'])
&&
$token['access_token'])
{
$data['access_token']=$token['access_token'];
$data['createtime']=$time;
$data['ex_time']=$token['expires_in'];
$data['rate']=$result[0]['rate']+1;
//$sql='update
ly_token
set
token="'.$token['access_token'].'"
,createtime='.$time.',ex_time='.$token['expires_in'].'
where
`id`='.$result[0]['id'];
$model=M('token');
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)療銷售咨詢合同范本
- 供應(yīng)商尾款合同范本
- 北京拆遷合同范本
- 單人旅游合同范本
- 單位郊區(qū)租房合同范本
- 丟車包賠協(xié)議合同范本
- 單位電線更換維修合同范例
- 醫(yī)藥調(diào)查項(xiàng)目合同范本
- 出錢經(jīng)營(yíng)合同范本
- 農(nóng)業(yè)種植股合同范本
- 新課標(biāo)初中語(yǔ)文7-9年級(jí)必背古詩(shī)文言文
- 培訓(xùn)中的基本學(xué)習(xí)原理-課件
- 現(xiàn)代文閱讀《有聲電影》答案詳細(xì)解析
- 銷售合同模板英文銷售合同模板
- 不忘教育初心-牢記教師使命課件
- 藥品不良反應(yīng)及不良反應(yīng)報(bào)告課件
- FSC認(rèn)證培訓(xùn)材料
- Germany introduction2-德國(guó)國(guó)家介紹2
- 大學(xué)計(jì)算機(jī)基礎(chǔ)(Windows10+Office2016)PPT完整全套教學(xué)課件
- 精素材:描寫植物的好詞好句好段
- 急危重癥患者靜脈通路的建立與管理月教學(xué)課件
評(píng)論
0/150
提交評(píng)論