京东省 jingdong.areas.province.get

http://jos.jd.com/api/showTools.htm?id=1014&groupId=68

{
“jingdong_areas_province_get_responce”: {
“code”: “0”,
“baseAreaServiceResponse”: {
“resultCode”: 1,
“data”: [{
“parentId”: 0,
“level”: 1,
“areaName”: “北京”,
“status”: 1,
“areaId”: 1
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “上海”,
“status”: 1,
“areaId”: 2
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “天津”,
“status”: 1,
“areaId”: 3
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “重庆”,
“status”: 1,
“areaId”: 4
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “河北”,
“status”: 1,
“areaId”: 5
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “山西”,
“status”: 1,
“areaId”: 6
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “河南”,
“status”: 1,
“areaId”: 7
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “辽宁”,
“status”: 1,
“areaId”: 8
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “吉林”,
“status”: 1,
“areaId”: 9
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “黑龙江”,
“status”: 1,
“areaId”: 10
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “内蒙古”,
“status”: 1,
“areaId”: 11
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “江苏”,
“status”: 1,
“areaId”: 12
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “山东”,
“status”: 1,
“areaId”: 13
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “安徽”,
“status”: 1,
“areaId”: 14
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “浙江”,
“status”: 1,
“areaId”: 15
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “福建”,
“status”: 1,
“areaId”: 16
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “湖北”,
“status”: 1,
“areaId”: 17
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “湖南”,
“status”: 1,
“areaId”: 18
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “广东”,
“status”: 1,
“areaId”: 19
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “广西”,
“status”: 1,
“areaId”: 20
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “江西”,
“status”: 1,
“areaId”: 21
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “四川”,
“status”: 1,
“areaId”: 22
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “海南”,
“status”: 1,
“areaId”: 23
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “贵州”,
“status”: 1,
“areaId”: 24
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “云南”,
“status”: 1,
“areaId”: 25
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “西藏”,
“status”: 1,
“areaId”: 26
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “陕西”,
“status”: 1,
“areaId”: 27
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “甘肃”,
“status”: 1,
“areaId”: 28
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “青海”,
“status”: 1,
“areaId”: 29
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “宁夏”,
“status”: 1,
“areaId”: 30
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “新疆”,
“status”: 1,
“areaId”: 31
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “台湾”,
“status”: 1,
“areaId”: 32
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “钓鱼岛”,
“status”: 1,
“areaId”: 84
}, {
“parentId”: 0,
“level”: 1,
“areaName”: “港澳”,
“status”: 1,
“areaId”: 52993
}]
}
}
}

PHP 连接 Memcached 服务

connect(‘localhost’, 11211) or die (“Could not connect”); //连接Memcached服务器
$memcache->set(‘key’, ‘test’); //设置一个变量到内存中,名称是key 值是test
$get_value = $memcache->get(‘key’); //从内存中取出key的值
echo $get_value;
?>

ThinkPHP5.0多数据库切换

在项目开发中需要Thinkphp5读取多个数据库的数据,我的已经成功了在这里介绍一下,只需要简单的几步
这里写图片描述
database.php是框架默认的数据库配置,里面写数据库1的信息,新建了个database2.php是放置数据库2的信息。
创建完数据库2之后,在config配置文件里,文件最后引入数据库2的配置信息

$db_con2 = require_once(‘database2.php’);
然后在return 数组加添加
‘db_con2’ => $db_con2,

代码中引用:
选择数据库1的时候,我是用模型查询的直接写SQL语句:

//模型查询
$user = new User();
$result = $user->where(‘username’, $data[‘username’])
->where(‘password’, $data[‘password’])
->find();
或者
User::where(‘id’,’1′)->find();

//普通结构查询
Db::table(‘think_user’)->where(‘id’,1)->find();

查询数据库2的信息时,调用普通查询语句:

$list = Db::connect(‘db_con2’)
->table(‘nrf_amf_reg_info’)
->alias(‘r’)
->join(‘nrf_amf_server s’,’r.Id = s.nrf_amf_reg_Id’,’LEFT’)
->paginate();
或者
$list = Db::connect(‘db_con2’)->name(‘nrf_disc_record’)->paginate();
注:nrf_amf_reg_info和nrf_disc_record为表名

这样,及时在一个项目中,也能分别调用不同数据库中的数据了!!!

浏览器调用手机摄像头录像

最近用MUI做了个移动端项目,设计中涉及到调用手机摄像头拍照等功能需求,然而在PLUS环境下才能直接调用,这就让人有点头疼了,后经查询资料学习了解到有一个很简单的方法就是input:file标签,不需要复杂代码操作就能实现调用拍照、相册等功能。

//capture — 设置选择需要调用的功能
//camera — 照相机
//camcorder — 摄像机
//microphone — 录音
//accept — 直接打开系统文件目录



//input:file标签还有一个属性multiple 用来支持多选 直接呼出原生选项

PHP中使用cURL实现Get和Post请求的方法

1.cURL介绍

cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等。最爽的是,PHP也支持 cURL 库。本文将介绍 cURL 的一些高级特性,以及在PHP中如何运用它。

2.基本结构

在学习更为复杂的功能之前,先来看一下在PHP中建立cURL请求的基本步骤:

(1)初始化
curl_init()

(2)设置变量
curl_setopt() 。最为重要,一切玄妙均在此。有一长串cURL参数可供设置,它们能指定URL请求的各个细节。要一次性全部看完并理解可能比较困难,所以今天我们只试一下那些更常用也更有用的选项。

(3)执行并获取结果
curl_exec()

(4)释放cURL句柄
curl_close()

Ecshop:后台添加新功能栏目以及管理权限设置

一、添加菜单项

打开 /admin/includes/inc_menu.php文件(后台框架左边菜单),在最后添加一行如下:

1$modules[’17_other_menu’][‘sns_list’] = ‘sns_list.php?act=list’;

ecshop默认一级菜单项有16项,所里这里的例子从17开始。当然这个key可以随便取的,index.php文件中对菜单用了ksort排序。“17_other_menu” 表示一级菜单,“sns_list”表示二级菜单。等号后面的值表示该菜单栏目打开的页面链接。

二、配置菜单语言

打开 /languages/zh_cn/admin/common.php文件,添加语言

1$_LANG[’17_other_menu’] = ‘其它设置’;

2$_LANG[‘sns_list’] = ‘SNS管理’;

这时候,用管理员身份(admin用户)登录后台,便可看到新添加的菜单项了。因为admin的权限是“all”。如果后台有多个管理员,比如ecshop商城的供货商们,或者其它管理人员(由admin创建的其它可登陆后台的账户),如果想让他们也拥有新添加菜单的查看权利,则必须为他们分配该栏目的管理权限。

三、把新菜单加入权限列表

打开 /languages/zh_cn/admin/priv_action.php文件,在“权限管理的一级分组”注释行下面添加如下代码

1$_LANG[‘other_manager’] = ‘其它设置’;

这里的“other_manager”是该一级栏目的权限名称,这里和栏目名称“17_other_menu”保持一致,也可以随便取个名。这里以示区别,就没有和菜单名一样。

然后,添加二级栏目“sns_list”的权限名称。在本文件的最后添加即可

1//其它管理

2$_LANG[‘sns_list’] = ‘SNS管理’;

这里这个权限名称和二级菜单名是一致的。这两项现在在哪里呢?如下图

四、把一级菜单和二级菜单的权限关联起来

Ecshop:后台添加新栏目打开数据库,看到{pre}_admin_action表,新增两行数据。如下图

截图中第1列数据是action_id,是该表的自增主键。第2列数据是parent_id,来自上级的action_id。第3列数据就是step3中定义的权限名(键)。这样的话,两种权限就联系起来了。到这里,打开后台“管理员列表”,点击“分派权限”的图标,便可以看到step3示图所示权限了。用某后台用户勾选提交,该用户登陆后就能看到新增的菜单项了。\

mysql语句:

INSERT INTO .`admin_action` ( `action_id` , `parent_id` , `action_code` , `relevance` ) VALUES ( NULL , ‘6’, ‘shipment_view’, ” );

五 在权限对照表admin/incluedes/inc_priv.php文件中添加
$_LANG[‘sns_list’] = ‘SNS管理’;
$purview[‘sns_list’] = ‘sns_list’;

iOS&Android集成微信支付-Server篇(PHP)

整个支付流程,在App支付成功返回后,你的服务器并不知道相关的订单已经支付成功。这时候微信服务器会向你设置的服务器Notify URL发送POST请求,告诉你支付成功了。所以服务端主要需要实现的工作就是验证签名以及验证是否是微信发来的通知。
获取PrePay

在微信支付(统一下单)文档中是这样描述的:

除被扫支付场景以外,商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易回话标识后再按扫码、JSAPI、APP等不同场景生成交易串调起支付。

关于获取预支付接口的请求参数、返回结果以及错误码请查看官方文档。有一点需要注意的是微信支付的接口参数用的是XML格式。下面就是获取PrePay的代码:

$wxpay_config = $this->wxpay_config = $this->my_config[‘wxpay_config’];
//var_dump($wxpay_config);

$APP_ID = $wxpay_config[‘app_id’]; //APPID
$APP_SECRET = $wxpay_config[‘app_secret’]; //appsecret
$MCH_ID=$wxpay_config[‘mch_id’];
$PARTNER_ID = $wxpay_config[‘partner_id’];
$NOTIFY_URL = $wxpay_config[‘notify_url’];

if (!$out_trade_no) {
$this->display_error(400,’请求是无效的’);
}
$order = $this->order_model->get_order_info($out_trade_no);
if (!$order) {
$this->display_error(1,’请求是无效的’);
}

//STEP 1. 构造一个订单。
$order=array(
“body” => $order[‘Subject’],
“appid” => $APP_ID,
“device_info” => “APP-001”,
“mch_id” => $MCH_ID,
“nonce_str” => mt_rand(),
“notify_url” => $NOTIFY_URL,
“out_trade_no” => $out_trade_no,
“spbill_create_ip” => $this->input->ip_address(),
“total_fee” => intval($order[‘TotalFee’] * 100),//注意:前方有坑!!!最小单位是分,跟支付宝不一样。1表示1分钱。只能是整形。
“trade_type” => “APP”
);
ksort($order);

//STEP 2. 签名
$sign=””;
foreach ($order as $key => $value) {
if($value&&$key!=”sign”&&$key!=”key”){
$sign.=$key.”=”.$value.”&”;
}
}
$sign.=”key=”.$PARTNER_ID;
$sign=strtoupper(md5($sign));//echo $sign.’
‘;exit;

//STEP 3. 请求服务器
$xml=”\n”;
foreach ($order as $key => $value) {
$xml.=”<“.$key.”>”.$value.”\n”;
}
$xml.=””.$sign.”\n”;
$xml.=””;

$opts = array(
‘http’ =>
array(
‘method’ => ‘POST’,
‘header’ => ‘Content-type: text/xml’,
‘content’ => $xml
),
“ssl”=>array(
“verify_peer”=>false,
“verify_peer_name”=>false,
)
);
$context = stream_context_create($opts);
$result = file_get_contents(‘https://api.mch.weixin.qq.com/pay/unifiedorder’, false, $context);

$result = simplexml_load_string($result,null, LIBXML_NOCDATA);

if ($result->return_code == ‘SUCCESS’ && $result->result_code == ‘SUCCESS’) {
$prepay=array(
“noncestr”=>””.$result->nonce_str,
“prepayid”=>””.$result->prepay_id,//上一步请求微信服务器得到nonce_str和prepay_id参数。
“appid”=>$APP_ID,
“package”=>”Sign=WXPay”,
“partnerid”=>$MCH_ID,
“timestamp”=>””.time(),
“sign”=>””
);
ksort($prepay);
$sign=””;
foreach ($prepay as $key => $value) {
if($value&&$key!=”sign”&&$key!=”key”){
$sign.=$key.”=”.$value.”&”;
}
}
$sign.=”key=”.$PARTNER_ID;
$sign=strtoupper(md5($sign));
$prepay[‘sign’] = $sign;
$prepay[‘success’] = true;
} else {
$prepay=array(
“success” => false,
“noncestr”=>””,
“prepayid”=>””,
“appid”=>$APP_ID,
“package”=>”Sign=WXPay”,
“partnerid”=>$MCH_ID,
“timestamp”=>””.time(),
“sign”=>””,
“return_msg”=>$result->return_msg
);
}

$this->response($prepay, 200);

此处有一个坑需要注意,微信支付接口的金额最小单位是分,跟支付宝不一样,1表示1分钱,且只能是整形。
客户端App通过该API获取到PrePay信息有就可以发起支付请求了。客户端的实现代码请查看文章《iOS&Android集成微信支付-Server篇》。
Notify URL

前面说过,这个URL是支付成功后微信调用的。那么微信Server是如何知道这个URL的呢?其实是在前面请求PrePay的时候通过参数notify_url传过去的。
微信调用支付结果通知的详细参数请访问文档「支付结果通用通知」。同样,参数格式也是XML。
所有这些参数中,我们最关心的应该是下面几个:
return_code :返回状态码。SUCCESS/FAIL
result_code : 交易标识,交易是否成功 SUCCESS/FAIL
out_trade_no : 商户订单号, 需要在你的数据库能够唯一标志订单
transaction_id :微信支付订单号,流水号。记录到你的数据库方便对账用
获取到这些信息后就可以从自己系统DB里面通过out_trade_no查询出相应的订单,标记为支付成功,并记录下相应的交易流水号transaction_id. 需要注意的是,处理玩业务逻辑后需要返回”return_code”为”success”给微信服务器。
Notify实现代码如下:

/**
* 微信支付Notify
*/
function wxpay_notify(){
//使用通用通知接口
$notify = new Notify_pub();

//存储微信的回调
$xml = $GLOBALS[‘HTTP_RAW_POST_DATA’];
$notify->saveData($xml);

//验证签名,并回应微信。
//对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,
//微信会通过一定的策略(如30分钟共8次)定期重新发起通知,
//尽可能提高通知的成功率,但微信不保证通知最终能成功。
if($notify->checkSign() == FALSE){
$notify->setReturnParameter(“return_code”,”FAIL”);//返回状态码
$notify->setReturnParameter(“return_msg”,”签名失败”);//返回信息
}else{
$notify->setReturnParameter(“return_code”,”SUCCESS”);//设置返回码
}
$returnXml = $notify->returnXml();
echo $returnXml;

//==商户根据实际情况设置相应的处理流程,此处仅作举例=======

//以log文件形式记录回调信息

$log_type=”wxpay_notify”;//log文件路径
$this->log_result($log_type,”【接收到的notify通知】:\n”.$xml.”\n”);

if($notify->checkSign() == TRUE) {
if ($notify->data[“return_code”] == “FAIL”) {
//此处应该更新一下订单状态,商户自行增删操作
$this->log_result($log_type,”【通信出错】:\n”.$xml.”\n”);
} elseif ($notify->data[“result_code”] == “FAIL”) {
//此处应该更新一下订单状态,商户自行增删操作
$this->log_result($log_type,”【业务出错】:\n”.$xml.”\n”);
} else {
//此处应该更新一下订单状态,商户自行增删操作
$this->log_result($log_type,”【支付成功】:\n”.$xml.”\n”);
$out_trade_no = $notify->data[‘out_trade_no’];
$trade_no = $notify->data[‘transaction_id’];

$order = $this->order_model->get_order_info($out_trade_no);
//echo “trade_no: $trade_no
out_trade_no: $out_trade_no”;print_r($order);
if($order[‘TradeStatus’] != ‘TRADE_FINISHED’ && $order[‘TradeStatus’] != ‘TRADE_SUCCESS’){
$data = array(‘TradeStatus’=>’TRADE_SUCCESS’,’TradeNo’=>$trade_no,’PayTime’=>time(),’PayType’=>’wxpay’);
$this->order_model->update_order_info($out_trade_no,$data);
}
}

}

}

完整的实现代码请移步Github下载。
Server端是基于CI框架实现的,如果你不熟悉的话也没有关系,下载demo后打开 /application/config/myconfig.php 文件,将数组 wxpay_config 中的 app_id,app_secret,mch_id, partner_id,notify_url,替换成你自己的配置即可运行。
其中 app_id,app_secret 是你在微信开放平台创建的应用。
mch_id为「微信支付商户号」,登录微信支付商户平台 即可看到。

在本文章Demo实现过程中,我没有采用任何安全验证措施,在实际开放过程中Server端API是需要根据自身情况采取相应安全策略的。

如需转载请保留原文链接

APP定制开发的完整流程

下面要介绍的APP定制开发的完整流程,即使是搞程序开发的也未必知道,因为这是一个产品经理完整详细的总结写出来的。流程不仅包括了开发标准流程,还包括了上线发布等阶段。需要在这里提醒的是,下面要说的是APP的定制开发,而不是其他的模板制作流程。一个移动APP项目研发规模可大可小,但都离不开以下几个成员:产品经理、ui设计师、前端开发、后端开发、测试等。如何合理安排项目成员工作、确保项目顺利进行呢?一个清晰合理的项目研发流程控制很重要。

我们可以按工作的性质不同先把APP的项目开发分成三个阶段,第一个阶段是需求阶段,第二阶段是研发阶段,第三阶段是发布阶段。每个阶段包括了多个步骤,循序渐进,最终完成项目的开发。

一、需求阶段

1、需求讨论:产品经理与客户沟通,做什么功能,怎么做,包括:开发类型、需要开发的平台、具体的产品功能需求、具体的产品设计需求、项目期望完成时间、开发预算,通过反复调研、讨论、输出交互方案。

2、需求评估:产品在输出交互方案后找相应的开发讨论需求方案是否可行,包括功能需求技术难度、评估设计需求可行性与体验评估、项目预期完成时间、实际开发费用。

3、项目技术开发与视觉规划。项目开始各个部门就开始项目的碰头会议,设计部门开始设计UI(产品界面)和UE(用户体验),针对产品开展创意设计,形成初步的效果图,经过首次客户的确认。在根据交流的具体结果进行二次修改,最终与客户确认高保真视觉图,开始进入研发阶段。

二、研发阶段

1、项目启动:开发根据产品需求文档进行需求评审,评估出研发周期、提测时间、预发布时间点、正式发布时间点。

2、程序开发流程:前端开发——程序开发——接口对接——第三方接入(支付宝等)——定期项目会议沟通和管控项目开发进展——开发预算审计。

3、程序测试:产品面向的平台多机型同步测试,包括:App内容测试、App性能测试、App功能测试、App视觉测试,对BUG调试修复。测试合格,确认没有bug后与客户进行沟通,开始验收。由客户进行测试,提出修改意见。

三、发布阶段

在上线发布前就需要提前准备好以下一些资料。

苹果的APP store审核一个应用需要一周左右时间,所以如果是计划上规定上线时间的项目,开发测试一定要提前半个月完成,以给上线审核预留时间。

安卓各市场一般审核较快,普遍在3天左右即可。

上线所需资料与注意事项

(一)申请成为开发者

1. 公司开发者上传营业执照扫描件(已年检)

2. 个人开发者上传个人有效身份证的正反两面扫描件

3. 所有上传证明材料必须真实有效;

4. 开发者提供的联系人,联系电话将作为手机应用市场与开发者联系的渠道,需真实有效

(二)上传软件资料注意事项

1.软件名称、文字介绍及截图不能违反国家相关规则;

2.软件介绍里有网址的,必须与软件开发者或者内容相关,不得有其他无关内容

3.软件图标、截图必须来源于上传软件且内容清晰,与当前版本对应

(三)app发布流程中需注意:

1.确保软件能正常安装、使用、卸载,保证良好的用户体验

2.不得抄袭,如有侵权行为则不会通过审核、已经上线软件将立即下架

3.不违反国家相关规则;

4.如软件有收费内容,必须给用户以明确的提示

5.如软件含有内置SDK(软件开发工具包),须不含违反国家相关法律的信息;

(四)手机App应用上线发布

1、App store发布

2、主流安卓市场发布

3、App下载页(web/wap)发布

4、二维码生成

5、App应用手册

从以上APP项目研发流程来看,每一个版本研发都要经历以上3个阶段12环节,理论图上看是一条完整的流水线,但是如何保证流程顺畅进行?如何使项目成员工作效率最大化?这十分考验产品经理/项目经理的版本规划能力。当然项目成员间的默契和沟通也很重要。

从笔者实践经验来看,要保证流水线顺畅,理想情况产品需求文档要领先前端开发2个版本,设计领先前端开发1个版本,后端开发领先前端开发半个版本。即在当前项目启动同时,产品经理已经在调研讨论下下版本需求;设计开始搞下版本的稿子;当前项目进行到一大半时,后端已经完成当前版本的需求,并开始准备下版本的需求预研。