竹磬网-邵珠庆の日记 生命只有一次,你可以用它来做些更多伟大的事情–Make the world a little better and easier


63月/180

Vagrant-安装教程及常见问题

发布在 邵珠庆

前言:
Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境。
它的主要意义是让所有开发人员都使用和线上服务器一样的环境,本质上和你新建一个虚拟机。
那最常见的,正常我们是怎么开发呢,大部分童鞋应该是在windows下搭建开发环境,敲代码,运行程序,达到效果git或svn提交,发布linux环境再看效果。
而vagrant virtualBox实现了把代码同步共享到linux虚拟机,而这个虚拟机你可以配成和你生产环境一样的,
说白了,通过共享文件到虚拟机,在类生产环境下运行。【让你在windows下体验到在linux开发的效果。
还有一种共享方式,可以借助IDE的develop功能通过sftp上传到服务器,然后访问服务器
三种方式总结:
【1】原始windows开发模式:windows开发-本地访问调试(与生产环境毕竟不同)-发布到linux运行
【2】vagrant virtualBox模式: windows开发 - 文件本地共享 -- 直接访问虚拟机(linux环境与生产一致)
【3】IDE develop 模式: windows开发 - 文件远程上传 -- 访问远程开发机(linux环境与生产一致)
其实【1】,与【2,3】的区别就在于,程序是在哪里运行的,windows本地?or Linux仿生产环境
(能在仿生产的环境直接开发肯定比在windows开发在放到linux更好些,开发方便避免一些环境上等的麻烦)
【2】与【3】的区别就在于文件是如何同步的:【2】是通过虚拟机文件共享实现同步;【3】直接利用sftp远程上传实现同步。
缺点:
【1】毫无疑问,它的弊端就是开发时不能模拟生产环境,可能会有衔接问题,环境有了问题不像虚拟机重安一台立刻搞定。
【3】存在的问题,比如:当切换开发分支后改动了文件a和b,当前ide选中的是a文件,ok他会自动上传更新,但是b文件不会,因为窗口你没在b文件下呀,没有那么智能不会自动触发上传更新,这点就坑了造成代码不同步,需要你自己手动触发一下相关文件的上传,尤其是依赖一些包的时候会发生丢失,得全项目上传一次;
【2】因为是本地和虚拟机的文件共享嘛,没有文件上传遗漏一说,所以还是很推荐用
目录:
一。安装虚拟机
二。Vagrantfile配置文件详解
三。连接虚拟机
四。碰到问题

一。安装虚拟机
1.添加box
vagrant box add base your_box_addres
注意:base是默认名称,主要用来标识一下你添加的box,后面的命令都是基于这个标识来操作的,你也可以用其他名称【但是用了其他名字记得在第二步用此名字init】
2.初始化
vagrant init
vagrant init box_name
如果你添加的box名称不是[base],那么需要在初始化的时候指定名称
3.启动虚拟机
vagrant up
启动过程可能比较长,耐心等待
图一.运行过程总图
图二
相关指令:

[plain] view plain copy

  1. vagrant up (启动虚拟机)
  2. vagrant halt (关闭虚拟机——对应就是关机)
  3. vagrant suspend (暂停虚拟机——只是暂停,虚拟机内存等信息将以状态文件的方式保存在本地,可以执行恢复操作后继续使用)
  4. vagrant resume (恢复虚拟机—— 与前面的暂停相对应)
  5. vagrant destroy (删除虚拟机,删除后在当前虚拟机所做进行的除开Vagrantfile中的配置都不会保留)
二.Vagrantfile配置文件详解
在我们的开发目录下有一个文件Vagrantfile,里面包含有大量的配置信息,主要包括三个方面的配置,虚拟机的配置、SSH配置、Vagrant的一些基础配置。(它的配置语法也是Ruby的)【修改配置文件,记得完后重启vagrant才能生效哦】

在我们的开发目录下有一个文件Vagrantfile,里面包含有大量的配置信息,主要包括三个方面的配置,虚拟机的配置、SSH配置、Vagrant的一些基础配置。Vagrant是使用Ruby开发的,所以它的配置语法也是Ruby的,但是我们没有学过Ruby的人还是可以跟着它的注释知道怎么配置一些基本项的配置。

具体介绍,参考:http://blog.csdn.net/chajinglong/article/details/52805915

[plain] view plain copy

  1. # -*- mode: ruby -*-
  2. # vi: set ft=ruby :
  3. # All Vagrant configuration is done below. The "2" in Vagrant.configure
  4. # configures the configuration version (we support older styles for
  5. # backwards compatibility). Please don\'t change it unless you know what
  6. # you\'re doing.
  7. Vagrant.configure(2) do |config|
  8.   # The most common configuration options are documented and commented below.
  9.   # For a complete reference, please see the online documentation at
  10.   # https://docs.vagrantup.com.
  11.   # Every Vagrant development environment requires a box. You can search for
  12.   # boxes at https://atlas.hashicorp.com/search.
  13.   config.vm.box = "base"
  14.   # Disable automatic box update checking. If you disable this, then
  15.   # boxes will only be checked for updates when the user runs
  16.   # `vagrant box outdated`. This is not recommended.
  17.   # config.vm.box_check_update = false
  18.   # Create a forwarded port mapping which allows access to a specific port
  19.   # within the machine from a port on the host machine. In the example below,
  20.   # accessing "localhost:8080" will access port 80 on the guest machine.
  21.   # config.vm.network "forwarded_port", guest: 80, host: 80
  22.   # Create a private network, which allows host-only access to the machine
  23.   # using a specific IP.
  24.   config.vm.network "private_network", ip: "192.168.33.10"
  25.   # Create a public network, which generally matched to bridged network.
  26.   # Bridged networks make the machine appear as another physical device on
  27.   # your network.
  28.   # config.vm.network "public_network"
  29.   # Share an additional folder to the guest VM. The first argument is
  30.   # the path on the host to the actual folder. The second argument is
  31.   # the path on the guest to mount the folder. And the optional third
  32.   # argument is a set of non-required options.
  33.   config.vm.synced_folder "D:/all_code/", "/home/www"
  34.   # Provider-specific configuration so you can fine-tune various
  35.   # backing providers for Vagrant. These expose provider-specific options.
  36.   # Example for VirtualBox:
  37.   #
  38.   # config.vm.provider "virtualbox" do |vb|
  39.   #   # Display the VirtualBox GUI when booting the machine
  40.   #   vb.gui = true
  41.   #
  42.   #   # Customize the amount of memory on the VM:
  43.   #   vb.memory = "1024"
  44.   # end
  45.   #
  46.   # View the documentation for the provider you are using for more
  47.   # information on available options.
  48.   # Define a Vagrant Push strategy for pushing to Atlas. Other push strategies
  49.   # such as FTP and Heroku are also available. See the documentation at
  50.   # https://docs.vagrantup.com/v2/push/atlas.html for more information.
  51.   # config.push.define "atlas" do |push|
  52.   #   push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME"
  53.   # end
  54.   # Enable provisioning with a shell script. Additional provisioners such as
  55.   # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
  56.   # documentation for more information about their specific syntax and use.
  57.   # config.vm.provision "shell", inline: <
  58.   #   sudo apt-get update
  59.   #   sudo apt-get install -y apache2
  60.   # SHELL
  61. end
三.连接虚拟机
1.虚拟机相关登录信息
vagrant ssh
这样我们就可以像连接到一台服务器一样进行操作了。
图三
2.ssh登录
window机器不支持这样的命令,必须使用第三方客户端来进行连接,例如xmoba、putty、Xshell等.

[plain] view plain copy

  1. ssh: 127.0.0.1
  2. 端口: 2222
  3. 用户名: vagrant
  4. 密码: vagrant
图四.xshell登陆举例
图五.xmoba登陆举例
3.系统信息
df -h
/vagrant这个目录是自动映射的,被映射到你刚刚建立的文件夹,这样就方便我们以后在开发机中进行开发,在虚拟机中进行运行效果测试了。
四。碰到问题:
1.vagrant up 时提示错误 cound not open file 问题
如果init指定了 add的名称test,那么init时也要说明,少了这一步
如下边错误演示与正确演示。
图六.错误演示
图七.正确演示
2.vagrant up 时提示错误:

[plain] view plain copy

  1. The guest machine entered an invalid state while waiting for it
  2. to boot. Valid states are \'starting, running\'. The machine is in the
  3. \'poweroff\' state. Please verify everything is configured
  4. properly and try again.
  5. If the provider you\'re using has a GUI that comes with it,
  6. it is often helpful to open that and watch the machine, since the
  7. GUI often has more helpful error messages than Vagrant can retrieve.
  8. For example, if you\'re using VirtualBox, run `vagrant up` while the
  9. VirtualBox GUI is open.
  10. The primary issue for this error is that the provider you\'re using
  11. is not properly configured. This is very rarely a Vagrant issue.
打开虚拟机启动,也会提示报错:

[plain] view plain copy

  1. Unable to load R3 module D:\virtualBox/VBoxDD.DLL (VBoxDD): GetLastError=1790 (VERR_UNRESOLVED_ERROR).
原因:
本目录中的以下三个文件是原始的未被破解的WIN7 64位系统主题文件:
themeservice.dll , themeui.dll ,uxtheme.dll
为了使用工具UniversalThemePatcher-x64.exe恢复主题,特地将以上3个文件,
各拷贝了一份,并重新命名如下:
themeservice.dll.backup ,themeui.dll.backup ,uxtheme.dll.backup
解决方法:
我们只须把重命名后的3个文件:
themeservice.dll.backup ,themeui.dll.backup ,uxtheme.dll.backup
拷贝到C:\Windows\System32目录下面,
然后运行工具UniversalThemePatcher-x64.exe进行恢复即可。
下载地址:http://download.csdn.net/download/ty_hf/10013443【里边有使用说明】
3.虚拟机一切正常,文件代码也映射到虚拟机,但就是不能正常访问。
a).配置文件需要删除

[plain] view plain copy

  1. sudo rm -f /etc/udev/rules.d/70-persistent-net.rules
问题就处在在持久网络设备udev规则(persistent network device udev rules)是被原VM设置好的,再用box生成新VM时,这些rules需要被更新。而这和Vagrantfile里对新VM设置private network的指令发生冲突。删除就好了。
b).如果设置了host,虚拟机里也要设置一次

[plain] view plain copy

  1. vi /etc/hosts

3.问题 default: Warning: Authentication failure. Retrying...

[plain] view plain copy

  1. Bringing machine \'default\' up with \'virtualbox\' provider...
  2. ==> default: Clearing any previously set forwarded ports...
  3. ==> default: Clearing any previously set network interfaces...
  4. ==> default: Preparing network interfaces based on configuration...
  5.     default: Adapter 1: nat
  6.     default: Adapter 2: hostonly
  7. ==> default: Forwarding ports...
  8.     default: 22 (guest) => 2222 (host) (adapter 1)
  9. ==> default: Booting VM...
  10. ==> default: Waiting for machine to boot. This may take a few minute
  11.     default: SSH address: 127.0.0.1:2222
  12.     default: SSH username: vagrant
  13.     default: SSH auth method: private key
  14.     default: Warning: Remote connection disconnect. Retrying...
  15.     default: Warning: Authentication failure. Retrying...
  16.     default: Warning: Authentication failure. Retrying...
  17.     default: Warning: Authentication failure. Retrying...
  18. Timed out while waiting for the machine to boot. This means that
  19. Vagrant was unable to communicate with the guest machine within
  20. the configured ("config.vm.boot_timeout" value) time period.
  21. If you look above, you should be able to see the error(s) that
  22. Vagrant had when attempting to connect to the machine. These errors
  23. are usually good hints as to what may be wrong.
  24. If you\'re using a custom box, make sure that networking is properly
  25. working and you\'re able to connect to the machine. It is a common
  26. problem that networking isn\'t setup properly in these boxes.
  27. Verify that authentication configurations are also setup properly,
  28. as well.
  29. If the box appears to be booting properly, you may want to increase
  30. the timeout ("config.vm.boot_timeout") value.

解决:

编辑Vagrantfile ,添加如下文件

[plain] view plain copy

  1. config.ssh.username = "vagrant"
  2. config.ssh.password = "vagrant"
然后重启vagrant 重新加载配置文件

[plain] view plain copy

  1. vagrant halt
  2. vagrant up

注意登陆的时候看下 vagrant ssh 看下你的登录信息,端口号

4.报错问题:

[plain] view plain copy

  1. Bringing machine \'default\' up with \'virtualbox\' provider...
  2. Your VM has become "inaccessible." Unfortunately, this is a critical error
  3. with VirtualBox that Vagrant can not cleanly recover from. Please open VirtualBox
  4. and clear out your inaccessible virtual machines or find a way to fix
 解决:
 http://doodlebobbers.com/vagrant-error-your-vm-has-become-inaccessible/
其实就是删除.vagrant文件夹,然后重启vagrant
5.vagrant 启动的时候报错

[plain] view plain copy

  1. A Vagrant environment or target machine is required to run this
  2. command. Run vagrant init to create a new Vagrant environment. Or,
  3. get an ID of a target machine from vagrant global-status to run
  4. this command on. A final option is to change to a directory with a
  5. Vagrantfile and to try again.

少前边步骤了,比如vagrant init;或者没有进入对应vagrant init的文件夹

6.vagrant dns解析异常,访问接口特别慢,在Vagrantfile 配置文件中添加下边代码:

[plain] view plain copy

  1. config.vm.provider :virtualbox do |vb|
  2. vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
  3. vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
7.vagrant up 又提示新报错!

[plain] view plain copy

  1. D:\vcode>vagrant up
  2. Bringing machine \'default\' up with \'virtualbox\' provider...
  3. Your VM has become "inaccessible." Unfortunately, this is a critical error
  4. with VirtualBox that Vagrant can not cleanly recover from. Please open VirtualBo
  5. x
  6. and clear out your inaccessible virtual machines or find a way to fix
  7. them.
相关资源:
官网下载:https://www.vagrantup.com/downloads.html
虚拟机等相关安装包: 链接:http://pan.baidu.com/s/1dEWSnEL 密码:ajaq
本文地址:http://blog.csdn.net/ty_hf/article/details/78314583
235月/160

微信开发常见报错及解决方法

发布在 邵珠庆

小技巧:可能过ctrl+f 进行查找您遇到的问题。

支付方式 报错提示 解决方法  
热点问题 支付返回签名错误 注意签名参数的大小写,支付密钥key要到商户平台设置,设置的规则是32位数字与字母大小写的组合。以下链接为签名过程。
(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=3_1)
 
 
支付回调 认证后的服务号之间支持跨号支付。  
支付失败 请检查商户号是否错误或支付密钥key设置错误。  
redirect——uri参数错误 请进入公众平台-开发者中心,找到填写商户的支付授权域名,填写的就是商户支付授权目录上的域名。  
paysinkey如何获取? 新版的微信支付是没有这个paysignkey参数的,具体的参数请查看文档  
(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=3_1)  
mchid是指什么? MCHID参数指的是商户号  
openid的获取请参考文档 openid的获取请参考文档详细介绍  
(http://mp.weixin.qq.com/wiki/14/bb5031008f1494a59c6f71fa0f319c66.html)  
openid如何获取? openid的获取请参考文档查看详细介绍:  
(http://mp.weixin.qq.com/wiki/14/bb5031008f1494a59c6f71fa0f319c66.html)  
Appsecret如何获取? APPsecret参数可进入公众平台(https://mp.weixin.qq.com)开发者中心查看。  
调用报错
get_brand_wcpay_request:fail
签名错误,请仔细检查签名。  
spbill_create_ip 是指什么? spbill_create_ip 指的是终端ip,在APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP。  
网页支付(JSAPI) “当前公众号没有权限支付本次交易“ 检查该公众帐号是否已经获取了支付资格。  
“公众帐号支付使用了无效的商户号,无法发起该笔交易” 检查商户号使用错误。  
“该公众号支付签名无效,无法发起该笔交易” 调起支付MD5签名的MD5签名错误,请检查相关签名。  
“Args Error” 提交JS时,josn传递参数必须与文档中名字一致,大小写匹配。  
“access:not_allow” 未设置白名单,添加位置:微信公众平台=》微信支付=》开发配置  
点击支付无反应 支付授权目录是否正确,如果使用的是支付测试目录,是否设置了白名单,需白名单帐号进行支付测试。  
ios系统可以正常支付,android系统支付失败 timestamp字段值需要加上“”,传递数据必须为字符串类型。  
调用报错
get_brand_wcpay_request:fail
签名错误,请仔细检查签名。  
调用报错:
zhgj-2014+中涵国际分销商城及“订单满送红包无法送”
商户设置有问题。  
IOS系统调用支付JSAPI报错
缺少参数:$key0$,android 没问题
提交的参数有问题,注意全部参数都得是字符串类型。  
支付验证签名失败 签名错误,仔细检查签名。  
jsapi 缺少参数 key0 问题出在网页端调起支付API接口中timeStamp参数,必须是string类型,但是php默认生成的时间戳是int类型。
解决方法:修改下lib/Wxpay.Data.php约2731行处SetTimeStamp方法,修改为$this->values['timestamp'] = (string)$value;
 
安卓手机可以收到满送红包 苹果的不行 红包虽然已经显示发送了红包但是实质资金流水没有扣除资金 参数错误,请仔细检查。  
调用报错:
传输参数错误
推测为提交的支付请求参数不正确;以下文档有详细的参考。https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7  
调用报错:
没有获取到微信支付预支付ID,请管理员检查微信支付配置项
需要按照文档要求 ,先获取prepay_id。  
支付权限检查失败 商户所用的参数对应的APPID是APP支付;如果商户想要JSAPI支付,需要在公众平台申请公众号,公众号支付中才有此参数。  
原生支付(扫码支付) “获取商户数据失败” 请检查申请native支付时的回调URL地址是否正确,是否可以外网访问获取数据。  
“商户返回数据错误” native回调返回数据格式错误,非XML格式数据。  
“签名错误” 检查MD5签名中参数格式及值是否正确。  
调用报错:
获取商户订单信息超时或商户返回httpcode非200
签名错误,请仔细检查签名。  
错误返回:错误码:60 错误通过修改文件:WxPay.Api.php解决,具体如下:
第537行
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TURE);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,2);//严格校验
to
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);//严格校验2
微信支付错误两个问题的解决:curl出错,错误码:60
 
APP支付 错误返回“-1” 开放平台配置的报名和应用签名是否一致:(android);确认是否使用正式的keystore打包apk并安装调试;(android);提交订单部分需要在服务器端完成。  
下单报{"errcode":62621014,"errmsg":""} Package数据MD5签名错误,请参照文档检查。  
下单报"1001"错误 package里缺少必要参数;金额类型为证书,单位是分。  
android签名正常,ios签名错误 需要注意body如果是中文,需要编码,编码格式统一为“UTF-8”。  
支付授权地址没有经过ICP验证 域名需要是英文备案域名方可。(此情况针对备案域名中包含中文字符或其他)  
ios系统:订单成功,无法跳转到支付界面 请仔细查阅参考开发文档步骤。  
支付结果报错:errStr=null,code=-1 请检查开放平台配置的包名和签名是否跟APK安装后的包名签名一致,一致才会调用的。  
支付无法调起 请检查开放平台配置的包名和签名是否跟你的APK安装后的包名签名一致,一致才会调用的。  
需要V3版的app支付服务端demo,因获取prepayId失败,找不到app_key 新版的微信支付是没有这个参数的,请查看最新版文档。  
请求prepayid发生错误:
errcode":268497023,"errmsg
请将商户的APPID和商户号以及报错截图发送至wepayTS@tencent.com,进行深入了解。  
支付返回报错:
:"errcode":268497023,"errmsg":"您已完成交易接口升级,老接口交易权限已关闭,请使用新接口进行交易。如有疑问请联系微信支付客服咨询"
请将商户的APPID和商户号以及报错截图发送至wepayTS@tencent.com,进行深入了解。  
请求prepayid发生错误:
信息[{"errcode":268497023,"errmsg":"鎮ㄥ凡瀹屾垚浜ゆ槗鎺ュ彛鍗囩骇锛岃 鎺ュ彛浜ゆ槗鏉冮檺宸插叧闂紝璇蜂娇鐢ㄦ柊鎺ュ彛杩涜浜ゆ槗銆傚鏈夌枒闂鑱旂郴寰俊鏀粯瀹㈡湇鍜ㄨ"}]
请将商户的APPID和商户号以及报错截图发送至wepayTS@tencent.com,进行深入了解。  
根据文档下订单,调用微信支付失败。调用微信支付的时候,微信为登录状态则无反应;微信未登录状态,会调用微信登录界面。 请将商户的APPID和商户号以及报错截图+请求参数详情,发送至wepayTS@tencent.com,进行深入了解。  
常见问题 申请正在审核中,如何可以提前调试测试? 只需要资料审核通过,收到通知邮件即可通过配置测试目录进行联调测试。未审核通过可下载文档进行开发,但不能联调测试。  
支付授权目录是什么? 支付授权目录是支付功能正式上线后,商户后台发起支付请求的页面所在的目录。  
支付测试目录是什么? 支付测试目录提供给开发者,在开发测试期间使用的临时目录。  
支付测试目录和授权目录有何区别? 支付授权目录将会在产品上线审核时,以及上线后长期使用的正式目录;测试目录只能配置白名单,才可以在公众号内发起支付。  
如何配置支付目录(授权、测试)? 登录微信公众平台-微信支付-开发配置-修改  
支付目录有什么规则? 头部需要包含http或https,须细化到二级或三级目录,字母小写,以左斜杠“/”结尾。  
如何配置授权回调页面域名? 登录微信公众平台=》开发者中心=》网页授权获取用户基本信息=》修改  
微信支付接口的签名规则是如何的? MD5签名,订单数据签名,所有传输的字段均需要参与签名,使用商户密钥key在签名字段排序后放入在最后组包签名。  
 “订单数据签名验证失败”如何解决? 检查参数是否一致;是否含有特殊字符;中文编码类型是否与所传参数一致;body参数是否含空格,若有空格URLencode的时需要转为%20。  
报40001错误,如何解决? accesstoken失效或者过期,accesstoken有效期为2小时,如果有系统或者人为重新获取,前一个accesstoken也会自动消失。请保证accesstoken为全局管理,避免重复获取。  
签名正常,却提示fail_invalid appid 查看支付授权目录是否设置正确,所支付页面路径是否在支付授权目录下。  
公众号是否可以跨号支付? 两个具有支付权限的服务号之间可以跨号支付,但不可混淆appid。  
支付完成,Notify URL无法接收回调通知 需要绝对路径,外网可访问,不支持非80端口,同时注意不要被防火墙拦截;可自行用fiddler模拟post访问是否正常。  
查询订单接口报“errcode":49001,"errmsg": 检查accesstoken是否为同一APPID获取;POST数据必须为JSON格式,  
"not same appid with appid of access_token"错误如何解决? 避免格式不对导致获取APPID不一致。  
支付提示“系统繁忙,请稍后再试” 检查签名及传入参数是否与文档要求一致;尤其是MD5签名部门的正确性。  
调用支付报错【特殊】 调用报错:
“chooseWXPay:fail”
此情况需要商户将提交的签名过程发送至邮箱:wepayTS@tencent.com,进行深入了解。  
调用报错:
“{return_msg=支付权限检查失败, return_code=FAIL}”
此情况需要将提交的xml发送至邮箱:wepayTS@tencent.com,进行深入了解。  
zhgj-2014+中涵国际分销商城及“订单满送红包无法送” 请将商户的APPID和商户号以及报错截图发送至wepayTS@tencent.com,进行深入了解。  
微信支付完成后不能执行回调 请将商户的APPID和商户号以及报错截图发送至wepayTS@tencent.com,进行深入了解。  
报错:不允许跨号支付
ios上没这个问题,android上有些商品有这个问题
是否通过订阅号发出此请求,请将APPID,商户号,报错截图及请求参数发送至wepayTS@tencent.com,进行深入了解。