2017-10-27 08:31:22 weixin_34253126 阅读数 62
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27754 人正在学习 去看看 秦子恒

首先附上链接:https://github.com/ecfexorg/w...

由于工作原因,先后进行过微信开放平台,企业微信,阿里钉钉的第三方开发。在这个过程中都会有解密服务器推送来的消息的需求,而且经过这几次开发后,发现微信开放平台/企业微信/阿里钉钉的加密解密算法都是使用的 AES256,同时加密的消息体结构也是一样的。

同时由于找到的第三方包的代码要么提供的功能太多,要么用了过时的 api,对于强迫症的我来说很难忍受,所以自己造了一个轮子来解决这三方的消息加密解密的需求。

使用的是 TypeScript 编写的,编译生成声明文件,用 vscode 开发能有良好的代码提示(不过这么简单的库貌似也没啥需求...)

下面说下用 TypeScript 开发一个 npm 项目并且发布到 npm 的构建和开发流程:

一、首先在 github 上创建一个项目,项目名称最好和想要发布的 npm 包名一致,创建时可以选择是否生成 README 和证书,这里我就选择了 MIT 证书和默认的 README。

二、然后在本地使用git clone命令将项目克隆下来,然后cd wx-ding-aes,再执行npm init,因为目录中包含了.git文件夹,所以 npm 初始化时可以自动填入 github 地址,文档地址等 package 属性。

我们给生成的 package.json 文件的scripts增加一条"build": "tsc",于是呆会儿执行npm run build就能编译我们的代码了。

同时为了让别人使用我们的库时也能有良好的代码提示,所以我们编译时生成声明文件在types文件夹下,发布时要连声明文件一起提交,同时还要在 package.json 中增加一个属性"types": "types/index.d.ts",意思是告诉别人这个库是自带声明文件的,并且声明文件的入口是在types目录下的index.d.ts里,当然如果你的"main"的值不是index.js,那么"types"也要改变,让它能和"main"对上号。

三、初始化完成后,执行npm i typescript @types/node -D安装 TypeScript 和 Node.js 标准库的声明文件。然后在touch tsconfig.json创建 TypeScript 的配置文件,在 vscode 中编写 TypeScript 的配置文件会有属性名和属性值提示。

{
  "compilerOptions": {
    "target": "es2017",
    "outDir": "dist",
    "module": "commonjs",
    "declaration": true,
    "declarationDir": "types"
  },
  "include": [
    "src"
  ]
}

这里我的配置很简单,"target": "es2017"表示编译目标的 JS 版本是 es2017;"outDir": "dist"表示编译后的 JS 文件放在dist文件夹中;"module": "commonjs"表示编译后的 JS 还是使用 commonjs 的模块系统;"declaration": true"declarationDir": "types"表示编译时会自动生成声明文件,并且声明文件放在types目录下。"include": [ "src" ] 表示 src 目录里面的文件会被编译。

注:Node.js 从 8.5 版本开始已经开始支持 es 模块系统,不过写这篇文章时还处于实验阶段,需要加上--experimental-modules参数才能使用

四、准备工作做完,然后可以开始写代码了,我把所有的代码都放在src目录下,写完后npm run build就能看到自动生成的dist文件夹里装着编译后的 JS 文件,而types文件夹则装着自动生成的声明文件。

关于微信的加密解密逻辑,其使用的是标准的 aes-256 加密算法的 cbc 模式,算法是可以实现的,不过 node.js 的标准库提供的crypto模块已经有了,所以我们就不需要重复造轮子(有人看到这个名词肯定会马上跑去 npmjs.org 搜 aes256,但是我觉得一个项目的依赖应该越少越好,毕竟别人写的东西质量可维护性都不可控)。aes-256 加密时,被加密的内容长度应该是 32 字节的倍数,如果不是 32 的倍数则需要进行补全。补全有很多种方式,最简单的是用 0x00 补全,但是微信要求用 pkcs7 进行补全,所以这里我们也用这种方式(有人看到肯定又会跑去 npmjs.org 搜 pkcs7 了...)。

简单几句话就能概括这种补全方式:

假设被加密的内容长度为 x

  1. 如果 x 不是 32 的倍数,可以得到比 x 大的最小的 32 的整数是 y,加密时在被加密内容后面加上 y - x 个 y - x
  2. 如果 x 是 32 的倍数,那么在被加密内容后面加上 32 个 32

两个例子:

  1. 被加密的 buffer 长度为 53 ,比 53 大的、最小的 32 的倍数的证书应该是 64 ,64 - 53 = 9,那么这个 buffer 后面就加上 9 个 9 使他的长度变成 64 ;
  2. 被加密的 buffer 长度为 64 ,那么直接加上 32 个 32 ,使他的长度变成 96 。

这样做的目的是方便解密后截取原来的数据,解密后,只要看看最后一个数是多少(假设是 x ),那么就把最后的 x 个 byte 截掉就能得到前面被补全之前的数据了。上面的两个例子中,第一个只要看到最后一个数是 9 ,那就把最后 9 个 byte 去掉,前面的就是正确的内容,第二个例子之所以补 32 个 32 ,也是因为看到最后一个数是 32 ,那就把后面的 32 个 byte 截掉即可。假如因为已经是 32 的倍数就不补全,那么就不知道是补全了的还是没补全过的了。

代码就不一一解释,因为原理就在上面了。

五、写完后npm run build就能编译了,如果想发布到 npmjs.org ,首先并不是整个项目里的所有文件都要被发布的,发布到 npm 的话应该在package.json"files"属性里选择哪些是想上传的,比如这个项目我之上传生成的 JS 和声明文件以及证书,因为源码是没必要上传的。

如果没有 npm 帐号的话,那么就要先注册一个 npm 的帐号,然后在终端里执行npm login登陆你的帐号。然后运行npm publish即可发布,如果你担心有时忘了编译就执行了publish,可以在"scripts"里面增加"prepublish": "npm run build",表示每次发布之前都会先自动执行编译脚本。更多的钩子命令可以在 npmjs.org 的官方文档查看。

六、
目前 npm 发布的包是无法使用npm unpublish <package name>来进行下架了,只能通过npm deprecate来标记过时,所以建议大家除非确定自己有能力和精力去维护一个包,否则不要轻易发布一些乱七八糟的包,更不要去占一些自己没有能力维护的好的包名。如果实在想unpublish,可以邮件联系 support@npmjs.com 说明原因,他们会根据描述来进行处理。根据我的经验,由于时差,一般白天发邮件他们会深夜回复,然后你第二天会收到回复。

希望对大家有帮助 :P

2019-09-25 10:42:43 akuiblog 阅读数 18
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27754 人正在学习 去看看 秦子恒

前言:

  1. 微信:已成功定位并解决自动化问题
  2. 钉钉:目前可以定位到,但是代码无法切换webview

appium+微信

  1. 把微信的开发者模式调出 debugx5.qq.com
    随意发送消息,内容为“debugx5.qq.com”。点击debugx5.qq.com, 这就会跳转至微信的x5内核调试页面
    信息—勾选"是否打开TBS内核Inspector调试功能
    在这里插入图片描述
    2.在谷歌输入“chrome://inspect/#devices” ,点击微信内部
    会显示出相应链接,点击inspect即可出现定位页面
    在这里插入图片描述
    注意
    如果inspect之后,页面不能显示/显示404,则需要登录vpn,即可显示

  2. 代码部分
    import time
    import unittest
    import warnings

import unittest2
from appium import webdriver

class BaseTestCaseWX3(unittest2.TestCase):

def setUp(self):
    warnings.filterwarnings("ignore")
    self.caps={
        "platformName": "Android",
        # mate8
        "platformVersion": "8.0.0",
        "deviceName": "5LM0216729001841",
        "automationName": "Appium",   # Appium版本:1.8.2
        # 微信
        "appPackage": "com.tencent.mm",
        "appActivity": "com.tencent.mm.ui.LauncherUI",
        "noReset": "true",
        # 键盘
        "unicodeKeyboard": True,  # 使用unicode编码方式发送字符串
        "resetKeyboard": True,   # 把键盘隐藏起来
        
        # webview的进程名,查到的是com.tencent.mm:tools
        "chromeOptions": {
            "androidProcess": "com.tencent.mm:tools"
        }
    }
    self.driver=webdriver.Remote("http://localhost:4723/wd/hub", self.caps)
    #self.driver.implicitly_wait(10)
    time.sleep(10)
    
    # 打印所有页面会打印出俩: ['NATIVE_APP','WEBVIEW_com.tencent.mm:tools']
    print(self.driver.contexts)       
    time.sleep(3)
    # 切换至webview页面
    self.driver.switch_to.context('WEBVIEW_com.tencent.mm:tools')
    time.sleep(5)

亲自使用,可以正常使用,作为记录也为他人提供方便。
2019-01-31 16:30:31 u013381271 阅读数 782
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27754 人正在学习 去看看 秦子恒

我开发的这个插件地址如下:
官方注册地址:
http://www.redmine.org/plugins/redmine_work_wechat
代码库:
https://bitbucket.org/39648421/redmine_work_wechat

最近部署和安装全新的开发环境,安装时有一些备忘:
有些系统的环境没有curl底层支持库,比如linux下需要libcurl.so,则在启动服务时抛出异常:

/home/coding/.rvm/gems/ruby-2.2.10/gems/ffi-1.10.0/lib/ffi/library.rb:145:in `block in ffi_lib': Could not open library 'libcurl': libcurl: cannot open shared object file: No such file or directory. (LoadError)
Could not open library 'libcurl.so': libcurl.so: cannot open shared object file: No such file or directory.
Could not open library 'libcurl.so.4': libcurl.so.4: cannot open shared object file: No such file or directory

需要利用apt-get或yum安装一下软件包:
ubuntu下是:
sudo apt-get install libcurl4-openssl-dev

2019-08-16 20:26:23 qq_36505993 阅读数 199
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27754 人正在学习 去看看 秦子恒

内网穿透目的:

用互联网能访问你本地 的应用、网站,接口,ftp,例如在用互联网打开你本地http://localhost:8080接口服务。

这里举两个例子:

后端开发的同学请看:

微信和钉钉开发需要80端口,本地不能方便的调试,可以看看本文提供的方法。不用借助花生壳等收费服务,即可将本地应用,对外开放。未使用内网穿透时,本地接口只能通过"localhost:端口号/user/list.do?name=你好"这样子,并且只能在同网段(多数情况是自己电脑)访问。使用内网穿透时,你可以使用 “域名/user/list.do?name=你好”访问接口,并且只要能连上互联网,就能访问。

前端同学请看:

你使用的开发工具可能也支持,在本地创建一个站点/服务,来访问页面,js,img等资源。大多数的访问方式是,通过“localhost:端口号/my/index.html”,当然只能在你的电脑上/同网段中访问。内网穿透后,你可以直接访问 “域名/my/index.html”。

总之:

你的网站,接口或其他静态资源文件,在你的电脑中,而你想通过互联网,让其他人访问到。请使用本文提供的方法和工具,无需注册,登录,免费。无需安装,解压即可,一键启动

开始:

  • 工具下载:

    • Windows:
      • http://openftp.ngrokk.fun/windows_amd64.zip
      • http://openftp.ngrokk.fun/windows_386.zip
    • Linux:
      • http://openftp.ngrokk.fun/linux_arm.zip
      • http://openftp.ngrokk.fun/linux_386.zip
    • Mac:
      • http://openftp.ngrokk.fun/darwin_amd64.zip
      • http://openftp.ngrokk.fun/darwin_386.zip
  • 解压:

    • 解压时杀毒软件可能会报病毒警告 ,可忽略
    • 随便解压到哪个目录都行
  • 运行:

    • #####以Windows为例,双击运行脚本,文件名为 “BatMan-Ngrok启动工具”,输入自定义域名,按Enter,本地开放的端口号,按Enter。等待两三秒左右,自动完成映射。

双击脚本文件,弹出窗口,输入自定义域名(可以随便起个),按回车确定

自己随便起个域名

输入本地的端口号,就是你要服务占用的端口号,(localhost:8080,8080就是端口号),按回车确定

输入本地端口号

稍等几秒,显示online就表示成功。

如图
http://abab.ngrok.ngrokk.fun -> 127.0.0.1:8080
https://abab.ngrok.ngrokk.fun -> 127.0.0.1:8080
表示的意思,通俗的讲:
访问 http://abab.ngrok.ngrokk.fun 就等于访问 127.0.0.1:8080 或 localhost:8080
访问 https://abab.ngrok.ngrokk.fun 就等于访问 127.0.0.1:8080 或 localhost:8080
而且 用域名的方式访问时,即使你不是同一网段也可以正常访问。也就是说,你可以用手机开数据访问,也可以把链接发给别人,别人也是可以访问到的。

大功告成

目前TCP可用端口范围50000~65535

2019-08-21 09:03:45 weixin_42921672 阅读数 377
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27754 人正在学习 去看看 秦子恒

钉钉小程序 开发 PHP + 钉钉小程序 (企业内部应用)

应公司需求 需要结合钉钉开发小程序 由于公司自用 所以选择了 企业内部应用 我在做之前和做的过程中 查不到几乎可用的资料 我就把我遇到的 能想起来的,给要接触的童鞋们 参考一下吧
钉钉文档: https://ding-doc.dingtalk.com/

在这里插入图片描述
目前钉钉的文档还没有完善的类似微信 有很多微信有的 钉钉还没有 希望将来可以支持吧
搞不明白的去微信看看文档 基本能弄明白

1.缓存
微信 :wx.setStorageSync(“userid”, data.data.userid) wx.getStorageSync(“userid”, data.data.userid)
钉钉:(简直想死)
在这里插入图片描述
包括get 也不会让你失望(有点难受 这附近代码 我重写优化了好几次 真的 )
在这里插入图片描述
2.loading(钉钉文档里 在我开发时 我找遍了 没有,我拿着微信的代码 ,有loading 但无文字 我就试了一个content 就可以了 避避坑)
钉钉:dd.showLoading({content: ‘正在加载’,})
微信:wx.showLoading({title: ‘加载中’,})
3.钉钉中我没有找到弹框 于是让前端同事给我写了一个


<view class="lightbox" style="{{light}}"></view>

 <view class="xx-tbox fl fd" style="{{box}}">
   <view class="nr-zi1">录入签名提示</view>
   <view class="nr-zi2 bottom-x">是否去补齐签名?</view>
   <view   onTap="cancel" class="link-1 fl right-x">取消</view>
   <view  onTap="sure" data-userid="{{userids}}" class="link-2 fl">确定</view>
</view>
 .lightbox{width:100%;z-index:101; height:100%;background-color:#333;filter:alpha(Opacity=20);-moz-opacity:0.2;opacity: 0.2; position: fixed; top:0px; left:0px;}

  .xx-tbox{ width: 60%; margin: 20%; background-color: #fff; margin-top: 40%; height: 130px; z-index: 999;}
  .nr-zi1{ width: 100%; font-size: 16px; text-align: center; line-height: 32px; margin-top: 15px;}
  .nr-zi2{ width: 100%; font-size: 12px; text-align: center; line-height: 22px; padding-bottom: 15px;}
  .link-1{ width: 49.5%; height: 46px; line-height: 46px; font-size: 14px; text-align: center; color: #333; }
  .link-2{ width: 49.5%; height: 46px; line-height: 46px; font-size: 14px; text-align: center; color: #71d398; }
  .right-x{border-right-width: 1px; border-right-style: solid; border-right-color: #f4f4f4; }

在这里插入图片描述
5.在开发调试阶段 建议增加一个 ClearCache 否则 你setData 里面清除不掉 造成其他影响 清除缓存 文档中有
写过小程序js 这句就当没看见 js中每一个方法{}, (花括号后跟英文逗号) 最后一个方法不加。

  ClearCache(event){
      dd.removeStorage({
        key: 'info',
      success: function(){
        }
      });
    },

6.钉钉小程序 每个页要单独保存 后编译 但是有批量保存
微信小程序 是只要ctrl + s 就保存所有 + 编译
7.网络请求

			 dd.httpRequest({
                  url: 'http://url?userid='+userid,
                  method: 'POST',
                  data: { userid: userid},
                  dataType: 'json',
                  success: (res) => {
                    // console.log('emmm res======' + res);
                    },
                 })

8.获取到的数据 要this.setData({})
data值仅在当页生效
9.开发工具(钉钉这个模拟器 还比较满意 可以分离出开发工具 有点类似android 开发了的感觉 总让我有一种android studio 的感觉)

我应该没有暴露什么吧 emmm。。。。。。。。。。。。

10.登陆钉钉账号后 开发工具左上角要选择自己在开发者后台创建的应用类型
app.js 中 需要绑定企业id

App({
  onLaunch(options) {
    // 第一次打开
    // options.query == {number:1}
    console.info('App onLaunch');
    console.info(options);
   this.globalData.corpId = options.query.corpId;
  },
  onShow(options) {
    // 从后台被 scheme 重新打开
    // options.query == {number:1}
  },
   onHide() {
    console.log('App Hide');
  },
  
   globalData: {
    corpId: "",
    hasLogin: false,
  },
});

11.获取token 我用的是TP5.1

	/**
	 *  查看缓存内是否存在token信息 并检测是否过期
	 *  如过期 则重新获取token
	 * JAM
	 * @return type $token
	 */
	public function getAccessToken()
    {
		$appkey = APP_KEY;
		$appsecret = APP_SECRET;
		$expire_time = Cache::get('expire_time');
		$access_token = Cache::get('access_token');
		//如果token緩存存在
		if(!empty($access_token)){
			if($expire_time < time()){
				$token = $this->get_token($appkey,$appsecret,$token_file_name);
			}else{
				$token = $access_token;
			}
		} else {//否则token緩存不存在
			$token = $this->get_token($appkey,$appsecret,$token_file_name);
		}
		return $token;
	}
	


	

	/**
	 *  请求钉钉接口获取token
	 *  JAM
	 * @param  type $appkey
	 * @param  type $appsecret
	 * @return type $token
	 */
	public function get_token($appkey,$appsecret)
	{
		$url = "https://oapi.dingtalk.com/gettoken?appkey=".$appkey."&appsecret=".$appsecret;
		$get_result = json_decode($this->http($url),true);
		if($get_result['errcode'] == '0')
		{
			$new_token = (object)[];
			$token = $get_result['access_token'];         
			$new_token->expire_time = time() + 7000;
			$new_token->access_token = $token;
			Cache::set("expire_time",time() + 7000);
			Cache::set("access_token",$token);
			// $this->set_php_file($token_file_name,json_encode($new_token));
		}else{
			$token = 'get_token_error';
		}
		
        return 	$token;
	}





	/**
	 * 返回用户信息
	 * @return type $value 用户信息
	 */
	public function getUserInfo()
	{
		$code = input('param.authCode');
		$token = getAccessToken();
		$url = 'https://oapi.dingtalk.com/user/getuserinfo?access_token=' . $token . '&code=' . $code;
		$result = http_request_get($url);
		$res = json_decode($result,true);

		//根据userid 单独获取钉钉用户个人info
		$url1 = 'https://oapi.dingtalk.com/user/get?access_token=' . $token . '&userid=' . $res['userid'];
		$result1 = http_request_get($url1);
		$res1 = json_decode($result1,true);
		$info['code'] = $result?1:0;
		$info['res'] = $res;
		$info['res1'] = $res1;
		return json_encode($info);

	}

钉钉获取小程序免登授权码

  				dd.getAuthCode({
                  success:(res)=>{
                  var authCode = res.authCode
                  }, fail:function(err){
                  
  					}
                  })

11.webview
我做了个类似银行签名的东西 单个字单个字签字 然后拼在一起 注意webview白名单
webview 在模拟器 无法写字 canvas 画不上去 手机就没问题了 ,不知道是不是需要对应的事件js 在这里插入图片描述在这里插入图片描述

*服务端API若是调用不成功,看服务端ip地址是不是在白名单中,本地服务器测试的话,重启路由器后ip是会变,
不在白名单 去开发者后台配置一下 就ok 。
*钉钉开发 会涉及到一些 功能权限 需要就开一下 如果没权限就是用 会提示没有权限 注意一下就好。

一些常见的坑 我都列出来了 也有可能有我想不起来的 或者我没接触到的 如果有看到的 有不懂 留言我们探讨
后续 维护 如果碰到坑 在补充

domino微信开发

阅读数 988

企业微信消息推送

阅读数 4903

没有更多推荐了,返回首页