php 支付宝wap接口,呕心之作:支付宝的手机网站支付接口的应用,呕心之作_PHP教程...

news/2024/5/12 9:41:38/文章来源:https://blog.csdn.net/weixin_39869959/article/details/115595757

呕心之作:支付宝的手机网站支付接口的应用,呕心之作

由于去年做手机Portl接口的工作,需要使用支付宝的支付,于是手机网站支付接口就成了首选。

1.首先下载接口包

支付宝商家服务中心链接:https://b.alipay.com/login.htm?goto=https://b.alipay.com:443/newIndex.htm

手机网站支付的产品介绍:https://b.alipay.com/order/productDetail.htm?productId=2013080604609688

demo下载链接:https://doc.open.alipay.com/doc2/detail.htm?treeId=54&articleId=104511&docType=1 (请点击关键字demo,进行下载)

1643113643-0.png

解压下载的文件可以看到文件夹的结构如下图:

1643111625-1.png

我使用的是RSA签名方式,PHP-UTF-8的文件夹

2.readme.txt的文档说明

红色字体的文件是最重要的文件,也是必需的!

├lib┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈类文件夹

│ │

│ ├alipay_core.function.php ┈┈┈┈┈┈支付宝接口公用函数文件

│ │

│ ├alipay_notify.class.php┈┈┈┈┈┈┈支付宝通知处理类文件

│ │

│ ├alipay_submit.class.php┈┈┈┈┈┈┈支付宝各接口请求提交类文件

│ │

│ └alipay_rsa.function.php┈┈┈┈┈┈┈支付宝接口RSA函数文件

├log.txt┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈日志文件

├alipay.config.php┈┈┈┈┈┈┈┈┈┈┈┈基础配置类文件

├alipayapi.php┈┈┈┈┈┈┈┈┈┈┈┈┈┈支付宝接口入口文件

├notify_url.php ┈┈┈┈┈┈┈┈┈┈┈┈┈服务器异步通知页面文件

├return_url.php ┈┈┈┈┈┈┈┈┈┈┈┈┈页面跳转同步通知文件

├key┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈私钥公钥文件夹(用法见下方※注意※)

│ │

│ ├rsa_private_key.pem┈┈┈┈┈┈┈┈┈商户的私钥文件

│ │

│ └alipay_public_key.pem┈┈┈┈┈┈┈┈支付宝的公钥文件

├openssl┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈缺省dll文件(用法见下方※注意※)

│ │

│ ├libeay32.dll

│ │

│ ├ssleay32.dll

│ │

│ └php_openssl.dll

├cacert.pem ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈用于CURL中校验SSL的CA证书文件

└readme.txt ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈使用说明文本

3. 把必需的文件整合到框架里(我当时用的是thinkPHP框架)

(1)在

1643115256-2.png 里新建一个文件夹叫AliMobilePay,16431124L-3.png

把上图里的4个文件拷贝到AliMobilePay文件夹里,

对以上文件进行重命名,

alipay_core.function.php重命名为:Corefunction.php

alipay_notify.class.php重命名为:Notify.php

alipay_rsa.function.php重命名为:Rsafunction.php

alipay_submit.class.php重命名为:Submit.php

打开Notify.php,去掉一下代码,

require_once("alipay_core.function.php");

require_once("alipay_rsa.function.php");

同样的道理去掉其他3个文件里的包含文件。

(2)在根目录下建立一个文件夹key

在key文件夹里放入商户的私钥文件、支付宝的公钥文件、CA证书文件

1643111I5-4.png

如何生成RSA密钥:https://cshall.alipay.com/enterprise/help_detail.htm?help_id=474010&keyword=%C8%E7%BA%CE%C9%FA%B3%C9%B9%AB%CB%BD%D4%BF&sToken=s-5d0c889ac47741fd8094b26d4862696b&from=search&flag=0 (此文中描述的rsa_private_key.pem就是商家的私钥文件)

◆商户的私钥

1、不需要对刚生成的(原始的)私钥做pkcs8编码

2、不需要去掉去掉“-----BEGIN RSA PRIVATE KEY-----”、“-----END RSA PRIVATE KEY-----”

简言之,只要维持用openssl工具刚生成出来的私钥的内容即可。

◆支付宝公钥

1、须保留“-----BEGIN PUBLIC KEY-----”、“-----END PUBLIC KEY-----”这两条文字。

简言之,支付宝公钥只需要维持demo里的原样即可。

(3)alipay_config.php 配置文件

把alipay_config.php 配置文件整合到thinkPHP框架的配置文件里

php/**

* Created by PhpStorm.

* User: zhangxiaoliu

* Date: 16/4/15

* Time: 上午10:39*/

//支付宝商家服务中心链接:https://b.alipay.com/login.htm?goto=https://b.alipay.com:443/newIndex.htm

return array('ALIMOBILEPAY_CONFIG'=>array(//合作身份者id,以2088开头的16位纯数字, (合作身份者id的查看链接:https://b.alipay.com/order/pidAndKey.htm)

'partner' => '2088XXXXXXXXXXXX',

//收款支付宝账号,与partner的值一样

'seller_id' => '2088XXXXXXXXXXXX',

//商户的私钥(后缀是.pem)文件相对路径

'private_key_path'=> NEW_PORTAL_DOMAIN.'key/rsa_private_key.pem',

//支付宝公钥(后缀是.pem)文件相对路径

'ali_public_key_path'=> NEW_PORTAL_DOMAIN.'key/alipay_public_key.pem',

//签名方式 不需修改

'sign_type' => strtoupper('RSA'),

//字符编码格式 目前支持 gbk 或 utf-8

'input_charset'=> 'utf-8',

//ca证书路径地址,用于curl中ssl校验

'cacert' => NEW_PORTAL_DOMAIN.'key/cacert.pem',

//访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http

'transport' => 'http',

//这里是异步通知页面url,提交到项目的Payment控制器的notifyurl方法;

//需http://格式的完整路径,不能加?id=123这类自定义参数

'notify_url'=> NEW_PORTAL_DOMAIN.'portal.php/AliMobilePay/notify_url.php',

//这里是页面跳转通知url,提交到项目的Payment控制器的returnurl方法;

//需http://格式的完整路径,不能加?id=123这类自定义参数

'return_url'=> NEW_PORTAL_DOMAIN.'portal.php/AliMobilePay/return_url.php',

//支付成功跳转到的页面

'successpage'=>NEW_PORTAL_DOMAIN.'portal.php/Success/index',

//支付失败跳转到的页面

'errorpage'=>NEW_PORTAL_DOMAIN.'portal.php/Error/index',

//商品展示地址

'product_url'=>NEW_PORTAL_DOMAIN.'portal.php/Product/index',)

);

(4)支付宝帮助中心

https://cshall.alipay.com/enterprise/index.htm

4.调用支付宝接口

(1)新建一个AliMobilePay控制器

_order_model= new OrderModel();

$this->_order_service= new GuozhanOrderService();

$this->_log_pay_callbacks = new LogPaycallbacksService();

$this->_service = new UserService();

$this->_token_service = new TokenService();

$this->_RadcheckModel = new RadcheckModel();

$this->_Set_MotoRadius_service = new SetMotoRadiusService();

}

/**

* 执行新增订单

*/

protected function _post(){

if(isset($this->params['name']) && ($this->params['name']=="notify_url")){

$this->notify_url('notify_url');

die;

}

$this->insert_order();

}

protected function _get(){

/*

*根据配置文件里的路由规则:

*':'.$var_controller.'/[:name]/[:action]'=>':1/_index?',//匹配控制器后紧跟字符串,表示name

* 例如:http://portal_v2.com/portal.php/Payment/Return.html

* $notify_url会返回Return

*/

$notify_url = isset($this->params['name']) ? FilterComponent::getString($this->params['name']) : 'Unknown';

switch($notify_url){

case 'return_url':

$this->return_url($notify_url);

break;

default:

$this->_log_pay_callbacks->update(array('request_from'=>'Unknown'), false);

exit('Wrong request url');

}

}

//服务器异步通知页面方法

private function notify_url($notify_url){

$alipay_config = C('ALIMOBILEPAY_CONFIG');

//计算得出通知验证结果

$alipayNotify = new \AlipayNotify($alipay_config);

$verify_result = $alipayNotify->verifyNotify();

if($verify_result) {//验证成功

//商户订单号

$order_sn = $this->params['out_trade_no'];

//支付宝交易号

//$trade_no = $this->params['trade_no'];

//交易状态

$trade_status = $this->params['trade_status'];

$this->_log_pay_callbacks->update(array('request_from'=>$notify_url, 'order_sn'=>$order_sn, 'response_status'=>$trade_status), false);

if (in_array($trade_status,array('TRADE_SUCCESS','TRADE_FINISHED'))) {

//判断该笔订单是否在商户网站中已经做过处理

//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序

//如果有做过处理,不执行商户的业务程序

if(!$this->checkorderstatus($order_sn)){

$result=$this->orderhandle($order_sn);

if($result==true){

echo "success";

}else{

echo "fail";

}

}

}else{

echo "fail";

}

}else {

//验证失败

echo "fail";

}

}

//页面跳转同步通知

private function return_url($notify_url){

$alipay_config=C('ALIMOBILEPAY_CONFIG');

//计算得出通知验证结果

$alipayNotify = new \AlipayNotify($alipay_config);

$verify_result = $alipayNotify->verifyReturn();

if($verify_result) {//验证成功

//商户订单号

$order_sn = $this->params['out_trade_no'];

//支付宝交易号

//$trade_no = $this->params['trade_no'];

//交易状态

$trade_status = $this->params['trade_status'];

$this->_log_pay_callbacks->update(array('request_from'=>$notify_url, 'order_sn'=>$order_sn, 'response_status'=>$trade_status), false);

if (in_array($trade_status,array('TRADE_SUCCESS','TRADE_FINISHED'))) {

//判断该笔订单是否在商户网站中已经做过处理

//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序

//如果有做过处理,不执行商户的业务程序

if(!$this->checkorderstatus($order_sn)){

$result=$this->orderhandle($order_sn);

//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——

if($result==true){

header("Location:".C('ALIMOBILEPAY_CONFIG.successpage'));//跳转到配置项中配置的支付成功页面;

}else{

header("Location:".C('ALIMOBILEPAY_CONFIG.errorpage'));//跳转到配置项中配置的支付失败页面;

}

}

}else {

header("Location:".C('ALIMOBILEPAY_CONFIG.errorpage'));//跳转到配置项中配置的支付失败页面;

}

}else {

//支付宝页面“返回商户”按钮的链接,商品页面

header("Location:".C('ALIMOBILEPAY_CONFIG.product_url'));

}

}

//在线交易订单支付处理函数

//函数功能:根据支付接口传回的数据判断该订单是否已经支付成功;

//返回值:如果订单已经成功支付,返回true,否则返回false;

private function checkorderstatus($order_sn){

$status=$this->_order_model->where("order_sn='$order_sn'")->getField('order_status');

if($status == OrderModel::ORDER_STATUS_PAYED){

return true;

}else{

return false;

}

}

//处理订单函数

//更新订单状态,写入订单支付后返回的数据

private function orderhandle($order_sn){

try{

//开启事务

$this->_order_model->startTrans();

$data['order_status']=OrderModel::ORDER_STATUS_PAYED;

$affected_row=$this->_order_model->where("order_sn='$order_sn'")->save($data);

$find=$this->_order_model->where("order_sn='$order_sn'")->field('location_id,goods_id,mobile,goods_number')->find();

//根据goods_id查找card_name对应的上网时长

$goods_model=M('goods');

$card_model=M('card');

$card_name=$goods_model->where("id={$find['goods_id']}")->getField('card_name');

$duration=$card_model->where("location_id={$find['location_id']} and card_name='$card_name'")->order('id desc')->getField('duration');

$incre_time=($find['goods_number']) * $duration;

$user_model=M('user');

$mobile=$find['mobile'];

$user_info=$user_model->where("user_name='{$mobile}'")->field('id,end_time')->find();

$affected_row2=$user_model->where("user_name='{$mobile}'")->setInc('usable_time',$incre_time);

//如果end_time 大于当前的时间戳就累计,否则就更新:使用当前时间戳 加上 $incre_time

if($user_info['end_time'] >= time()){

$user_model->where("user_name='{$mobile}'")->setInc('end_time',$incre_time);

}else{

$update_data['end_time']=time()+$incre_time;

$user_model->where("user_name='{$mobile}'")->save($update_data);

}

if(empty($affected_row)){

$this->_log_pay_callbacks->setException(L('ERROR_FAILED_UPDATE_ORDER'), $this->_log_pay_callbacks->getException('code'));

throw new \Exception();

}

if(empty($affected_row2)){

$this->_log_pay_callbacks->setException(L('ERROR_FAILED_UPDATE_USABLETIME'), $this->_log_pay_callbacks->getException('code'));

throw new \Exception();

}

//提交更新

if($affected_row && $affected_row2) {

$this->_order_model->commit();

return true;

}

}catch(\Exception $e){

$this->_order_model->rollback();

return false;

}

}

private function insert_order(){

$gw_id = isset($this->params['gw_id']) ? FilterComponent::get($this->params['gw_id']) : '';

if (empty($gw_id)) {

exit('400_EMPTY_GWID');

}

$router=M('router');

$location_id=$router->where("gw_id='$gw_id'")->getField('supplier_location_id');

$goods_number = isset($this->params['goods_number']) ? FilterComponent::get($this->params['goods_number'],'int') : '';

if (empty($goods_number)) {

exit('400_EMPTY_GOODSNUMBER');

}

$mobile = isset($this->params['mobile']) ? FilterComponent::get($this->params['mobile']) : '';

if (!preg_match('/^1[0-9]{10}$/',$mobile)) {

exit('400_ERROR_MOBILE');

}

$user=M('user');

//查询充值号码是否存在

$user_name=$user->where("user_name='$mobile'")->getField('user_name');

if(!$user_name){

exit('400_EMPTY_USERNAME');

}

$goods_id = isset($this->params['goods_id']) ? FilterComponent::get($this->params['goods_id'],'int') : '';

if (empty($goods_id)) {

exit('400_EMPTY_GOODSID');

}

$goods=M('goods');

$unit_price=$goods->where("id=$goods_id")->getField('unit_price');

$this->params['WIDtotal_fee']=$unit_price * $goods_number;

$data['location_id']=$location_id;

$data['mobile']=$mobile;

$data['goods_id']=$goods_id;

$data['goods_type']=1;//1代表充值卡

$data['goods_number']=$goods_number;

$data['total_price']=$this->params['WIDtotal_fee'];

$data['pay_type']=OrderModel::PAY_TYPE_ALIPAY;//支付宝

//执行添加操作

$insert_id=$this->_order_service->update($data,false);

// var_dump($this->_order_service->getError());

// var_dump($this->_order_service->model->getError());

// var_dump($this->_order_service->model->getlastsql());die;

if($insert_id){

$this->params['WIDout_trade_no']=$this->_order_model->where("id=$insert_id")->getField('order_sn');

/**************************请求参数**************************/

//支付类型

$payment_type = "1";

//必填,不能修改

//商户订单号

$out_trade_no = $this->params['WIDout_trade_no'];

//商户网站订单系统中唯一订单号,必填

$this->params['WIDsubject']='pengwifi_card';

//订单名称

$subject = $this->params['WIDsubject'];

//必填

//付款金额

$total_fee = $this->params['WIDtotal_fee'];

//必填

//$this->params['WIDshow_url']=trim(C('ALIMOBILEPAY_CONFIG.product_url'));

$this->params['WIDshow_url']=$_SERVER['HTTP_REFERER'];

//商品展示地址

$show_url = $this->params['WIDshow_url'];

//必填,需以http://开头的完整路径,例如:http://www.商户网址.com/myorder.html

//订单描述

$body = $this->params['WIDbody'];

//选填

//超时时间

$it_b_pay = $this->params['WIDit_b_pay'];

//选填

//钱包token

$extern_token = $this->params['WIDextern_token'];

//选填

/************************************************************/

//构造要请求的参数数组,无需改动

$parameter = array(

"service" => "alipay.wap.create.direct.pay.by.user",

"partner" => trim(C('ALIMOBILEPAY_CONFIG.partner')),

"seller_id" => trim(C('ALIMOBILEPAY_CONFIG.seller_id')),

"payment_type"=> $payment_type,

"notify_url"=> trim(C('ALIMOBILEPAY_CONFIG.notify_url')),

"return_url"=> trim(C('ALIMOBILEPAY_CONFIG.return_url')),

"out_trade_no"=> $out_trade_no,

"subject"=> $subject,

"total_fee"=> $total_fee,

"show_url"=> $show_url,

"body"=> $body,

"it_b_pay"=> $it_b_pay,

"extern_token"=> $extern_token,

"_input_charset"=> trim(strtolower(C('input_charset')))

);

$alipay_config=C('ALIMOBILEPAY_CONFIG');

//建立请求

$alipaySubmit = new \AlipaySubmit($alipay_config);

//建立请求,以表单HTML形式构造(默认),经测试post方法不行

$html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");

echo $html_text;

}else{

echo 'fail';

}

}

}

http://www.bkjia.com/PHPjc/1120386.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1120386.htmlTechArticle呕心之作:支付宝的手机网站支付接口的应用,呕心之作 由于去年做 手机Portl 接口的工作,需要使用支付宝的支付,于是 手机网站支付接...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_743742.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php的网站换服务器地址,网站更换域名完整攻略

很多SEOER都遇到过这样的问题,网站发展了一段时间,关键词排名有了进展,流量增加了许多,网站开始有了收入,这时候便有了更换域名的想法,但是又担心更换域名会影响网站的权重和排名,进入左右为难的…

退出服务器维护,如何查看docker进程退出的原因_网站服务器运行维护

如何通过命令行查看docker服务是否已启动_网站服务器运行维护通过命令行查看docker服务是否已启动的方法是:通过运行命令【systemctl status docker】查看docker服务的运行状态,然后根据输出信息进行判断即可。问题还原:最近的docker容器经常…

网站下面的文件找不到_这5个优质资源网站,花钱你都找不到!

马上就要回家过年了,相信大家都很兴奋吧,平时工作特别忙碌,没有时间玩耍,游乐,有的甚至连看个电影都要安排好久,好不容易有时间看了吧,又为找不到资源发愁,你说烦人不烦人&#xff1…

在线图像识别相似图片_几个有趣的在线建站模板工具评测

现在各种在线辅助工具越来越多,一键式操作的快捷工具似乎总是那么受欢迎,特别是对小白朋友来说,他们希望用最简单的操作来完成自己心仪的作品,比如在线制作网站,在线设计等,今天小编给大家评测了一些在线工…

怎么绕过论坛回复_SEO做博客外链(评论/回复)应该怎么做才有用呢?

博客外链分为自建博客平台和博客评论回复两种外链形式,而本文主要讲述的是针对评论和回复的这种超级省事的博客外链创建技巧。那这种博客外链应该怎么做呢?网站为了提升关键词排名,SEO人员从站外做优化的最重要手段就是发外链,像2…

UML辅助网站规划和设计指南

一、概述 Web网站往往具有复杂与高度动态的特点。为了让Web应用在短时间之内开始运作,开发周期应该尽量地短。许多时候,开发者直接进入编写代码这一阶段,却不去仔细考虑自己想要构造的是什么样的网站以及准备如何构造:服务器端代码…

网站迁移到新服务器的步骤_网站迁移到日本服务器的正确做法

不管是个人站长还是企业站,都会遇到网站迁移的情况,比如说,为了拓展海外客户群体,将网站迁移到日本服务器,但是迁移网站,比如说将网站迁移到日本服务器,不仅仅是将数据上传到日本服务器上&#…

用 ASP.NET 2.0 改进的 ViewState 加快网站速度

如果您是个经验丰富的 ASP.NET 开发人员,一提起 ViewState ,您可能会不寒而栗,因为您想到的是大量通过“鸡尾酒吸管”吸入的 Base64 编码数据。除非采取步骤进行预防,否则大部分 ASP.NET 页面将有大量辅助数据被存储在一个名为 __…

可以ping通 打不开网页_如何快速解决“网站打不开”的问题?

不管是我们普通用户,还是网站管理员,没有很强大的技术能力的话,在遇到自己的网站打不开的情况可能会很着急,为了让大家更高效快速的应对“网站为啥打不开了”这个问题,今天我们就说一下网站打不开的原因有哪些&#xf…

seo查询工具源码_百度快照排名查询,显示次序工具分享,SEO优化从业者必备工具...

前一段时间看到网站SEO优化大牛,他们的百度搜索关键词之后打开的页面,很高端很神奇不知道是怎么回事,最近在偶然间安装浏览器插件的时候发现原来是插件实现的。这样我们在做百度快照排名的用上这样的工具简直是如虎添翼,因为这个插…

python写网站容易崩吗_刚刚,Python内幕被爆出!老码农:没控制住,心态已崩!...

作为一个老农民,这次我的心很凉! 原因很简单:前天晚上,当我在国内最大的同性组织的一个中心浏览时,我发现了这样一条信息: Python 116K 超过 C、JS, 薪酬排行第一(数据来自最大的招聘网站india.…

vc 功能源码 2020_非常适合运输公司,物流公司,的商业网站,附快速建站源码程序...

YIWOHE(今日头条号:yiwohe)资源储备专栏快速按需打搭建个性化站点系统平台的第5期,推荐非常适合运输公司,物流公司,的商业网站,附快速建站源码程序,一点安装部署,手机电脑平板一站式访问&#x…

前端seo优化_前端后端分离,怎么解决SEO优化的问题呢?

解决题主的问题,首先得先想明白什么是SEO,然后再说前后端分离情况下如何做SEO优化。我们假设这个产品是一个新产品,他需要做SEO,那么到底什么是SEO呢?SEO的缩写是『Search Engine Optimization』,搜索引擎优…

京东网站建表案例

表设计 建表语句 品类表 use shop; create table t_group( id int unsigned not null primary key auto_increment comment主键, g_id int unsigned not null comment品类编号, name varchar(200) not null default comment品类名称, unique index uniq_g_id(g_id), unique in…

seo日常工作表_SEO优化效果

SEO优化效果,英特互联大数据自己研发的,我们的愿景是希望帮助中小企业通过互联网揽到生意,提升企业的整体实力。SEO优化效果, 假设目标关键词是SEO优化论坛,比如百度,这个词就会被分割成SEO优化和论坛两个词…

asp.net发布网站时三个选项的问题

发布网站的时候有三个选项,很多人都不知道到底是怎么用的,简单说说: 第一个选项指定发布后是不是可以修改aspx文件,如果勾选,则发布后的网站行为基本与ASP.NET 1.1一致,只要没有增删修改控件&…

谈谈网站静态化

写在前头 静态化是解决减轻网站压力,提高网站访问速度的常用方案,但在强调交互的We2.0 时代,对静态化提出了更高的要求,静态不仅要能静,还要能动,下面我通过一个项目,谈谈网站静态化后的架构设计方案,同时和大家探讨一下,在开源产品大行其道,言架构必称MemberCache, Nginx,的时…

谷歌加载网页时的背景颜色更改_谷歌浏览器推出v76正式版改进黑色模式及阻止恶意网站劫持浏览器...

谷歌浏览器目前已经推出v76 正式版带来较多的安全改进,例如可以阻止网站识别用户是否使用的隐身模式。同时谷歌安全团队还发现部分恶意网站会劫持ESC 键 , 针对这些情况谷歌浏览器正在继续提高整体的安全性。此外谷歌浏览器新的API 接口允许网站读取用户是否使用黑色…

挂机网站是什么原理_SEOSEM知识浅析,提升综合运营能力——阿里巴巴国际站+独立站...

欢迎关注公众号:“白泽运营笔记”分享更多实用的阿里巴巴国际站运营技巧,解决运营中的实际难题。SEO是什么呢?就是搜索引擎优化,是一种利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名。主要是以关键词为核心的一种优化方式…

最全的静态网站生成器(开源项目)

原文地址: http://www.iteye.com/magazines/133-Static-Site-Generators#595将动态网页静态化,可以有效减轻服务器端的压力,并且静态网页的访问速度要快于动态网页。此外,使用静态网页还有利于搜索引擎的收录,从而提高…