HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

百度地图错误码

maps

Android

错误码 错误描述
AMBIGUOUS_KEYWORD 检索词有岐义
AMBIGUOUS_ROURE_ADDR 检索地址有岐义
KEY_ERROR key有误
NETWORK_ERROR 网络错误
NETWORK_TIME_OUT 网络超时
NO_ERROR 检索结果正常返回
NOT_SUPPORT_BUS 该城市不支持公交搜索
NOT_SUPPORT_BUS_2CITY 不支持跨城市公交
PERMISSION_UNFINISHED 授权未完成
RESULT_NOT_FOUND 没有找到检索结果
ST_EN_TOO_NEAR 起终点太近

iOS

错误码 错误描述
1 检索词有岐义
2 检索地址有岐义
3 该城市不支持公交搜索
4 不支持跨城市公交
5 没有找到检索结果
6 起终点太近
7 key错误
8 网络连接错误
9 网络连接超时
10 还未完成鉴权,请在鉴权通过后重试

授权类错误请参考:
http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=42223&page=1&extra=
http://developer.baidu.com/map/index.php?title=lbscloud/api/appendix

继续阅读 »

Android

错误码 错误描述
AMBIGUOUS_KEYWORD 检索词有岐义
AMBIGUOUS_ROURE_ADDR 检索地址有岐义
KEY_ERROR key有误
NETWORK_ERROR 网络错误
NETWORK_TIME_OUT 网络超时
NO_ERROR 检索结果正常返回
NOT_SUPPORT_BUS 该城市不支持公交搜索
NOT_SUPPORT_BUS_2CITY 不支持跨城市公交
PERMISSION_UNFINISHED 授权未完成
RESULT_NOT_FOUND 没有找到检索结果
ST_EN_TOO_NEAR 起终点太近

iOS

错误码 错误描述
1 检索词有岐义
2 检索地址有岐义
3 该城市不支持公交搜索
4 不支持跨城市公交
5 没有找到检索结果
6 起终点太近
7 key错误
8 网络连接错误
9 网络连接超时
10 还未完成鉴权,请在鉴权通过后重试

授权类错误请参考:
http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=42223&page=1&extra=
http://developer.baidu.com/map/index.php?title=lbscloud/api/appendix

收起阅读 »

5+App模块配置错误处理

HTML5+

HBuilder6.2.0+版本及HBuilderX中包含模块自动检测提示功能,提示开发者避免遗漏配置模块导致功能无法使用。

uni-app项目请参考新文档:https://uniapp.dcloud.net.cn/tutorial/app-modules.html

小程序SDK环境

如果您是原生工程集成小程序SDK,iOS 工程请参考这个 教程,Android 工程请参考这个 教程 ,不用看下面的教程;

App离线打包环境

如果您是离线工程打包App,iOS 工程请参考这个教程 ,Android 工程参考这个 教程,不用看下面的教程;

使用 HBuilderX 云打包请继续看下面的教程

缺失模块提醒框

当应用中调用5+ API对应的模块在5+ Runtime中不包含时弹出标题为“HTML5+ Runtime”提示框:

  • HBuilder|HBuilderX真机运行
    提示内容为“manifest.json中未添加XXX模块,请参考http://ask.dcloud.net.cn/article/283”
    其中XXX表示缺失的模块,如图:

  • App打包运行
    提示内容为“打包时未添加XXX模块,请参考http://ask.dcloud.net.cn/article/283”
    其中XXX表示缺失的模块,如图:

IDE中添加模块

解决此问题的方法是在HBuilder|HBuiulderX中添加缺失的模块,保存后提交App云端打包。
打开应用的manifest.json文件,切换到“模块权限配置”项(uni-app应用为“App模块权限配置”项),在右侧的“打包模块配置”中x勾选缺失的模块:

如果这些模块涉及三方sdk配置,还需要继续配sdk信息

比如map,勾选map模块后,仍需在sdk配置中选择是高德地图还是百度地图,并填写相关appkey信息。

如果是离线打包请参考离线打包配置教程

继续阅读 »

HBuilder6.2.0+版本及HBuilderX中包含模块自动检测提示功能,提示开发者避免遗漏配置模块导致功能无法使用。

uni-app项目请参考新文档:https://uniapp.dcloud.net.cn/tutorial/app-modules.html

小程序SDK环境

如果您是原生工程集成小程序SDK,iOS 工程请参考这个 教程,Android 工程请参考这个 教程 ,不用看下面的教程;

App离线打包环境

如果您是离线工程打包App,iOS 工程请参考这个教程 ,Android 工程参考这个 教程,不用看下面的教程;

使用 HBuilderX 云打包请继续看下面的教程

缺失模块提醒框

当应用中调用5+ API对应的模块在5+ Runtime中不包含时弹出标题为“HTML5+ Runtime”提示框:

  • HBuilder|HBuilderX真机运行
    提示内容为“manifest.json中未添加XXX模块,请参考http://ask.dcloud.net.cn/article/283”
    其中XXX表示缺失的模块,如图:

  • App打包运行
    提示内容为“打包时未添加XXX模块,请参考http://ask.dcloud.net.cn/article/283”
    其中XXX表示缺失的模块,如图:

IDE中添加模块

解决此问题的方法是在HBuilder|HBuiulderX中添加缺失的模块,保存后提交App云端打包。
打开应用的manifest.json文件,切换到“模块权限配置”项(uni-app应用为“App模块权限配置”项),在右侧的“打包模块配置”中x勾选缺失的模块:

如果这些模块涉及三方sdk配置,还需要继续配sdk信息

比如map,勾选map模块后,仍需在sdk配置中选择是高德地图还是百度地图,并填写相关appkey信息。

如果是离线打包请参考离线打包配置教程

收起阅读 »

5+API错误代码

错误代码 HTML5+

5+ API通常通过错误回调(ErrorCallback)函数返回错误,并且在回调函数中包含Event错误信息:

interface Event {  
    readonly attribute Number code;         // 错误码  
    readonly attribute String message;     // 错误描述信息  
}
  • code 表示错误码,可以在下面列表中查询到对应的错误原因:
    当code值为-100时,表示是使用第三方SDK时内部业务逻辑发生错误,此时需要查看message信息
  • message 表示错误描述信息,用于提示用户错误原因,当code值为-100时错误描述信息的格式为:
    [%模块名称%+%第三方SDK名称%: %第三方SDK错误码%]%错误描述信息%
    如“[OAuth微信:-1]未知错误,...”
    其中%第三方SDK错误码%参考:
    1. Maps(地图)
    2. Payment(支付)
    3. Share(分享)

通用错误

错误码 错误描述 备注
-1 参数错误 5+API传入的参数不正确
-2 用户取消 用户取消当前的操作
-3 此功能不支持 当前5+Runtime不支持此功能
-4 文件不存在 操作的文件或目录不存在
-5 IO错误 文件读写操作错误,如文件被其它程序占用等
-6 网络错误 无法连接到网络
-7 业务参数配置缺失 使用第三方SDK时缺失SECRET、APPID、APPKEY等数据
-8 客户端未安装 调用的第三方客户端未安装
-9 快捷方式已存在 创建快捷方式时快捷方式已存在,仅部分手机支持
-10 授权失败 用户拒绝该API访问
-99 未知错误 未定义的错误
-100 业务内部错误 使用的第三方SDK内部错误

OAuth(登录授权)

错误码 错误描述 备注
-1001 未登录或登录已注销
-1002 获取Token失败

univerify(一键登录)

错误码 错误描述
1000 当前 uniAppid 尚未开通一键登录
1001 应用所有者账号信息异常,请检查账号一键登录服务是否正常
1002 应用所有者账号信息异常,请检查账号余额是否充足
4001 请求参数异常
4003 开发者账户appid 校验异常,联系官方人员
5000 服务器未知异常,联系官方人员
30001 当前网络环境不适合执行该操作
30002 用户点击了其他登录方式
30003 用户关闭验证界面
30004 其他错误
30005 预登录失败
30006 一键登录失败
30007 获取本机号码校验token失败
40004 应用不存在
40047 一键登录取号失败
40053 手机号校验失败
40201 源IP鉴权失败

Runtime模块错误

错误码 错误描述 备注
-1201 WGT/WGTU文件格式错误
-1202 WGT安装包中manifest.json文件不存在
-1203 WGT安装包中manifest.json文件格式错误
-1204 WGT安装包中manifest.json文件的appid不匹配
-1205 WGT安装包中manifest.json文件的version版本不匹配
-1221 WGTU安装包中update.xml文件不存在
-1222 WGTU安装包中update.xml文件格式错误
-1223 WGTU安装包中update.xml文件的appid不匹配
-1224 WGTU安装包中update.xml文件的version版本不匹配
-1225 WGTU安装包中www目录下manifest.json不存在
-1226 WGTU安装包中www目录下manifest.json文件格式错误
-1227 WGTU安装包中www目录下manifest.json文件的appid不匹配
-1228 WGTU安装包中www目录下manifest.json文件的version版本不匹配
-1229 HTML5+ Runtime缺少升级包manifest.json中配置的模块 这种情况下应该使用apk/ipa升级
-1250 uni-app编译模式切换不支持升级应用资源

Audio模块错误

错误码 错误描述 备注
-1301 文件播放格式错误
-1302 文件请求超时

Sqlite模块错误

错误码 错误描述 备注
-1401 数据库没有打开
-1402 数据库已经打开
-1403 WWW目录下的数据库只有读权限
-1404 其他错误

<a id="geolocation"/>

Geolocation模块错误

错误码 错误描述 备注
-1501 坐标地址解析失败
-1502 坐标地址获取失败
-1503 不支持某个提供者,如:不支持腾讯地图
-1504 坐标系类型不支持
-1505 定位服务不能用
继续阅读 »

5+ API通常通过错误回调(ErrorCallback)函数返回错误,并且在回调函数中包含Event错误信息:

interface Event {  
    readonly attribute Number code;         // 错误码  
    readonly attribute String message;     // 错误描述信息  
}
  • code 表示错误码,可以在下面列表中查询到对应的错误原因:
    当code值为-100时,表示是使用第三方SDK时内部业务逻辑发生错误,此时需要查看message信息
  • message 表示错误描述信息,用于提示用户错误原因,当code值为-100时错误描述信息的格式为:
    [%模块名称%+%第三方SDK名称%: %第三方SDK错误码%]%错误描述信息%
    如“[OAuth微信:-1]未知错误,...”
    其中%第三方SDK错误码%参考:
    1. Maps(地图)
    2. Payment(支付)
    3. Share(分享)

通用错误

错误码 错误描述 备注
-1 参数错误 5+API传入的参数不正确
-2 用户取消 用户取消当前的操作
-3 此功能不支持 当前5+Runtime不支持此功能
-4 文件不存在 操作的文件或目录不存在
-5 IO错误 文件读写操作错误,如文件被其它程序占用等
-6 网络错误 无法连接到网络
-7 业务参数配置缺失 使用第三方SDK时缺失SECRET、APPID、APPKEY等数据
-8 客户端未安装 调用的第三方客户端未安装
-9 快捷方式已存在 创建快捷方式时快捷方式已存在,仅部分手机支持
-10 授权失败 用户拒绝该API访问
-99 未知错误 未定义的错误
-100 业务内部错误 使用的第三方SDK内部错误

OAuth(登录授权)

错误码 错误描述 备注
-1001 未登录或登录已注销
-1002 获取Token失败

univerify(一键登录)

错误码 错误描述
1000 当前 uniAppid 尚未开通一键登录
1001 应用所有者账号信息异常,请检查账号一键登录服务是否正常
1002 应用所有者账号信息异常,请检查账号余额是否充足
4001 请求参数异常
4003 开发者账户appid 校验异常,联系官方人员
5000 服务器未知异常,联系官方人员
30001 当前网络环境不适合执行该操作
30002 用户点击了其他登录方式
30003 用户关闭验证界面
30004 其他错误
30005 预登录失败
30006 一键登录失败
30007 获取本机号码校验token失败
40004 应用不存在
40047 一键登录取号失败
40053 手机号校验失败
40201 源IP鉴权失败

Runtime模块错误

错误码 错误描述 备注
-1201 WGT/WGTU文件格式错误
-1202 WGT安装包中manifest.json文件不存在
-1203 WGT安装包中manifest.json文件格式错误
-1204 WGT安装包中manifest.json文件的appid不匹配
-1205 WGT安装包中manifest.json文件的version版本不匹配
-1221 WGTU安装包中update.xml文件不存在
-1222 WGTU安装包中update.xml文件格式错误
-1223 WGTU安装包中update.xml文件的appid不匹配
-1224 WGTU安装包中update.xml文件的version版本不匹配
-1225 WGTU安装包中www目录下manifest.json不存在
-1226 WGTU安装包中www目录下manifest.json文件格式错误
-1227 WGTU安装包中www目录下manifest.json文件的appid不匹配
-1228 WGTU安装包中www目录下manifest.json文件的version版本不匹配
-1229 HTML5+ Runtime缺少升级包manifest.json中配置的模块 这种情况下应该使用apk/ipa升级
-1250 uni-app编译模式切换不支持升级应用资源

Audio模块错误

错误码 错误描述 备注
-1301 文件播放格式错误
-1302 文件请求超时

Sqlite模块错误

错误码 错误描述 备注
-1401 数据库没有打开
-1402 数据库已经打开
-1403 WWW目录下的数据库只有读权限
-1404 其他错误

<a id="geolocation"/>

Geolocation模块错误

错误码 错误描述 备注
-1501 坐标地址解析失败
-1502 坐标地址获取失败
-1503 不支持某个提供者,如:不支持腾讯地图
-1504 坐标系类型不支持
-1505 定位服务不能用
收起阅读 »

【技术分享】原生actionsheet集成到原生项目中去的大坑~~~~(>_<)~~~~

actionsheet 技术分享

actionsheet 底部弹出菜单;

第一种:H5模式的actionsheet
优点: 可通过css自由定制展现样式
缺点: 1.不支持覆盖顶部状态栏; 2.不支持跨webview的遮罩; 3.在有map等原生组件时,容易被遮挡

第二种:5 runtime封装的原生actionsheet
优点: 支持覆盖顶部状态栏,支持跨webview的遮罩,有原生组件也会在顶层;
缺点 不支持定义样式 (集成到原生可通过修改res的资源文件更改样式)

我想着现在的项目是HB做好html集成到原生Android项目去的,
那就选择用第二种吧,关键是写法超简单!

plus.nativeUI.actionSheet({  
        cancel: "取消",  
        buttons: [{  
            title: "拍照"  
        }, {  
            title: "相册"  
        }]  
    }, function(e) {  
        var index = e.index;  
        switch (index) { //case 0: 取消  
            case 1: //拍照  

                break;  
            case 2: //相册  

                break;  
        }  
    });

这个代码在HBuilder运行是正常的,效果如下

但是集成到原生咋就没有任何反应了呢!!
认真看官方文档也没有发觉要特别注意的地方
http://www.html5plus.org/doc/zh_cn/nativeUI.html#plus.nativeUI.actionSheet
然后检查配置文件,检查权限,检查集成的jar包 ,换手机调 ,,,总之一顿折腾..还是没有反应..

下载了最新的Android集成SDK,发现了个txt文件,写了这么个重要提示:

这个是什么意思呢??
1.RInformation.java的包名要改成啥样?

  1. ActionSheet哪个文件包名又不能改了?
  2. res目录下这么多图片布局资源,要拷的哪些?

好坑哇~~(>_<)~~
继续调半天:功夫不负有心人,调好了
(发誓集成到原生的actionsheet再也不用第二种了 唉 html写法简单,但是到原生要导入这么多东西):


最后记得导包:
nativeui.jar

继续阅读 »

actionsheet 底部弹出菜单;

第一种:H5模式的actionsheet
优点: 可通过css自由定制展现样式
缺点: 1.不支持覆盖顶部状态栏; 2.不支持跨webview的遮罩; 3.在有map等原生组件时,容易被遮挡

第二种:5 runtime封装的原生actionsheet
优点: 支持覆盖顶部状态栏,支持跨webview的遮罩,有原生组件也会在顶层;
缺点 不支持定义样式 (集成到原生可通过修改res的资源文件更改样式)

我想着现在的项目是HB做好html集成到原生Android项目去的,
那就选择用第二种吧,关键是写法超简单!

plus.nativeUI.actionSheet({  
        cancel: "取消",  
        buttons: [{  
            title: "拍照"  
        }, {  
            title: "相册"  
        }]  
    }, function(e) {  
        var index = e.index;  
        switch (index) { //case 0: 取消  
            case 1: //拍照  

                break;  
            case 2: //相册  

                break;  
        }  
    });

这个代码在HBuilder运行是正常的,效果如下

但是集成到原生咋就没有任何反应了呢!!
认真看官方文档也没有发觉要特别注意的地方
http://www.html5plus.org/doc/zh_cn/nativeUI.html#plus.nativeUI.actionSheet
然后检查配置文件,检查权限,检查集成的jar包 ,换手机调 ,,,总之一顿折腾..还是没有反应..

下载了最新的Android集成SDK,发现了个txt文件,写了这么个重要提示:

这个是什么意思呢??
1.RInformation.java的包名要改成啥样?

  1. ActionSheet哪个文件包名又不能改了?
  2. res目录下这么多图片布局资源,要拷的哪些?

好坑哇~~(>_<)~~
继续调半天:功夫不负有心人,调好了
(发誓集成到原生的actionsheet再也不用第二种了 唉 html写法简单,但是到原生要导入这么多东西):


最后记得导包:
nativeui.jar

收起阅读 »

Hbuilder 如何连接 visual studio 的模拟器

模拟器 adb

打开 vs 的模拟器后

关掉任务管理器里 hbuilder 的 adb.exe,
然后控制台执行 hbuild 的 adb.exe
adb connect 192.168.1.109

几秒钟后,就可以从 hbuilder 连 vs 的模拟器。

继续阅读 »

打开 vs 的模拟器后

关掉任务管理器里 hbuilder 的 adb.exe,
然后控制台执行 hbuild 的 adb.exe
adb connect 192.168.1.109

几秒钟后,就可以从 hbuilder 连 vs 的模拟器。

收起阅读 »

【公告】关于升级到MacOSX10.11beta3用户HBuilder无法启动的解决办法

Mac HBuilder

问题现象

MacOSX10.11beta3的用户启动HBuilder进入HBuilder主界面,显示无响应,同时dock栏一直在跳动

问题原因分析

MacOSX10.11beta3与eclipse不兼容,eclipse的绝大多数版本在该测试版OSX系统上无法启动,而HBuilder恰恰是基于出问题的某个eclipse版本定制的。

解决办法

MacOSX10.11beta4已修复此问题,请升级到MacOSX10.11beta3的用户再次升级版本到MacOSXbeta4

继续阅读 »

问题现象

MacOSX10.11beta3的用户启动HBuilder进入HBuilder主界面,显示无响应,同时dock栏一直在跳动

问题原因分析

MacOSX10.11beta3与eclipse不兼容,eclipse的绝大多数版本在该测试版OSX系统上无法启动,而HBuilder恰恰是基于出问题的某个eclipse版本定制的。

解决办法

MacOSX10.11beta4已修复此问题,请升级到MacOSX10.11beta3的用户再次升级版本到MacOSXbeta4

收起阅读 »

关于HBuilder“制作移动App资源升级包...”生成的wgt包升级后会导致部分功能失效的问题

wgtu wgt bug已修复

问题现象

使用HBuilderuilder6.0.0及之前版本打包ipa/apk包,HBuilder升级到6.1.0及之后版本,通过“发行”->“制作移动App资源升级包...”生成应用升级包wgt文件后,或者是生成应用差量升级包(wgtu)。
在之前安装ipa/apk包中通过应用升级(差量升级)后就一直停留在启动页面,或者进入应用后功能无法使用。

问题原因分析

确认是因为升级HBuilder6.1.0版本后没有兼容以前的UI模块导致的问题,会影响plus.webview.、plus.nativeUI.、plus.navigator.* API的使用。
新版本中已经将UI模块拆分成Webview、NativeUI、Navigator三个独立的模块,默认生成的wgt文件中没有添加UI模块权限,导致老版本Runtime更新wgt后判断缺少UI模块权限而无法调用相关API。

解决方案

目前可通过在manifest.json文件的"permissions"节点下添加“UI”节点解决。
打开应用的manifest.json文件,切换到“代码视图”,在"permissions"节点下添加“UI”数据如下:

"UI": {  
    "description": "系统原生控件"  
}

注:
6.1.0之后版本已经去掉模块权限的判断逻辑,不会存在此问题。
6.2.0版本默认添加UI模块,确保向下的兼容性。

继续阅读 »

问题现象

使用HBuilderuilder6.0.0及之前版本打包ipa/apk包,HBuilder升级到6.1.0及之后版本,通过“发行”->“制作移动App资源升级包...”生成应用升级包wgt文件后,或者是生成应用差量升级包(wgtu)。
在之前安装ipa/apk包中通过应用升级(差量升级)后就一直停留在启动页面,或者进入应用后功能无法使用。

问题原因分析

确认是因为升级HBuilder6.1.0版本后没有兼容以前的UI模块导致的问题,会影响plus.webview.、plus.nativeUI.、plus.navigator.* API的使用。
新版本中已经将UI模块拆分成Webview、NativeUI、Navigator三个独立的模块,默认生成的wgt文件中没有添加UI模块权限,导致老版本Runtime更新wgt后判断缺少UI模块权限而无法调用相关API。

解决方案

目前可通过在manifest.json文件的"permissions"节点下添加“UI”节点解决。
打开应用的manifest.json文件,切换到“代码视图”,在"permissions"节点下添加“UI”数据如下:

"UI": {  
    "description": "系统原生控件"  
}

注:
6.1.0之后版本已经去掉模块权限的判断逻辑,不会存在此问题。
6.2.0版本默认添加UI模块,确保向下的兼容性。

收起阅读 »

Mui的栅格系统

今天发现Mui有自己的栅格系统
但是使用起来有点小问题,不能嵌套切存在换行
看了下mui的grid9宫格的demo,发现在grid-view里面还做了修订才实现的

那么这样,增加一个mui-col样式就解决了所有问题,包括实现栅格的嵌套,给大家个参考:

<style>  
.mui-col{  
    margin-right: -4px;  
    display: inline-block;  
}  
</style>  
<div class="mui-content">  
    <div class="mui-col mui-col-xs-4">  
        <span class="mui-col mui-col-xs-6">46</span>  
        <span class="mui-col mui-col-xs-2">42</span>  
        <span class="mui-col mui-col-xs-4">44</span>  
    </div>  
    <div class="mui-col mui-col-xs-8">  
        <span>8</span>  
    </div>  
</div>
继续阅读 »

今天发现Mui有自己的栅格系统
但是使用起来有点小问题,不能嵌套切存在换行
看了下mui的grid9宫格的demo,发现在grid-view里面还做了修订才实现的

那么这样,增加一个mui-col样式就解决了所有问题,包括实现栅格的嵌套,给大家个参考:

<style>  
.mui-col{  
    margin-right: -4px;  
    display: inline-block;  
}  
</style>  
<div class="mui-content">  
    <div class="mui-col mui-col-xs-4">  
        <span class="mui-col mui-col-xs-6">46</span>  
        <span class="mui-col mui-col-xs-2">42</span>  
        <span class="mui-col mui-col-xs-4">44</span>  
    </div>  
    <div class="mui-col mui-col-xs-8">  
        <span>8</span>  
    </div>  
</div>
收起阅读 »

使用BroadcastReceiver监听蓝牙开关状态

蓝牙 Bluetooth

var main = plus.android.runtimeMainActivity();  
var BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");  
var BAdapter = new BluetoothAdapter.getDefaultAdapter();  
var resultDiv = document.getElementById('output');  
var receiver=plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {  
onReceive: function(context, intent) { //实现onReceiver回调函数  
    plus.android.importClass(intent);  
    console.log(intent.getAction());  
    resultDiv.textContent += '\nAction :' + intent.getAction();  
    main.unregisterReceiver(receiver);  
    }  
});  
var IntentFilter = plus.android.importClass('android.content.IntentFilter');  
var filter = new IntentFilter();  
filter.addAction(BAdapter.ACTION_STATE_CHANGED); //监听蓝牙开关  
main.registerReceiver(receiver, filter); //注册监听  

if (!BAdapter.isEnabled()) {  
    BAdapter.enable(); //启动蓝牙  
}else{  
    BAdapter.disable();  
}  

代码已测试过了ctrl+c直接使用

更新:5+已提供蓝牙,参考http://www.html5plus.org/doc/zh_cn/bluetooth.html 注意需要最新版HBuilderX

继续阅读 »

var main = plus.android.runtimeMainActivity();  
var BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");  
var BAdapter = new BluetoothAdapter.getDefaultAdapter();  
var resultDiv = document.getElementById('output');  
var receiver=plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {  
onReceive: function(context, intent) { //实现onReceiver回调函数  
    plus.android.importClass(intent);  
    console.log(intent.getAction());  
    resultDiv.textContent += '\nAction :' + intent.getAction();  
    main.unregisterReceiver(receiver);  
    }  
});  
var IntentFilter = plus.android.importClass('android.content.IntentFilter');  
var filter = new IntentFilter();  
filter.addAction(BAdapter.ACTION_STATE_CHANGED); //监听蓝牙开关  
main.registerReceiver(receiver, filter); //注册监听  

if (!BAdapter.isEnabled()) {  
    BAdapter.enable(); //启动蓝牙  
}else{  
    BAdapter.disable();  
}  

代码已测试过了ctrl+c直接使用

更新:5+已提供蓝牙,参考http://www.html5plus.org/doc/zh_cn/bluetooth.html 注意需要最新版HBuilderX

收起阅读 »

请Mac版用户近期不要升级MacOS 10.11beta3及10.11公测版

Mac

更新:最新版的mac系统已经修复了。此问题过期

苹果官方已确认MacOS 10.11beta3及10.11公测版与eclipse不兼容,而HBuilder基于eclipse做了深度定制,因此在mac10.11beta3及近期发布的公测版上,HBuilder也无法启动。
请大家近期不要升级Mac 10.11beta3及10.11公测版,并等待苹果修复bug
详情参见https://developer.apple.com/library/prerelease/mac/releasenotes/General/rn-osx-10.11/
相关内容截图如下:

继续阅读 »

更新:最新版的mac系统已经修复了。此问题过期

苹果官方已确认MacOS 10.11beta3及10.11公测版与eclipse不兼容,而HBuilder基于eclipse做了深度定制,因此在mac10.11beta3及近期发布的公测版上,HBuilder也无法启动。
请大家近期不要升级Mac 10.11beta3及10.11公测版,并等待苹果修复bug
详情参见https://developer.apple.com/library/prerelease/mac/releasenotes/General/rn-osx-10.11/
相关内容截图如下:

收起阅读 »

[源码] MCalenda 基于MUI的日历插件,史上最精简

插件 日历 Calenda 源码

正要用个日历插件,发现mui并没有,基于JQuery的插件都太重了,在我的小米手机上居然会有卡顿。
初学mui, 于是开始造轮子, 目标是抛弃所有依赖和花哨,纯精简,速度快,
先把Demo发布了,慢慢会增加week/day View和事件支持。

实例:

var MC = mui("#container").MCalendar();  
MC.changeDate(new Date())  
MC.hide()  
MC.show()  
MC.getDate()

源码在此:这能不能加精啊?
MCalendar源码

截图:

继续阅读 »

正要用个日历插件,发现mui并没有,基于JQuery的插件都太重了,在我的小米手机上居然会有卡顿。
初学mui, 于是开始造轮子, 目标是抛弃所有依赖和花哨,纯精简,速度快,
先把Demo发布了,慢慢会增加week/day View和事件支持。

实例:

var MC = mui("#container").MCalendar();  
MC.changeDate(new Date())  
MC.hide()  
MC.show()  
MC.getDate()

源码在此:这能不能加精啊?
MCalendar源码

截图:

收起阅读 »

微信支付服务端代码 .net C# MVC

技术分享

研究了很多demo示例,最后整理出了如下的.net MVC版本的微信支付服务端代码,亲测可行,服务端所需要的其他类文件我已经打包存附件了,需要的可以下载使用
以下只实现了基础功能,如果有什么问题还请大神们多多指教。

服务端代码:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Web;  
using System.Web.Mvc;  
using WeddingCarService.Models;  
using Newtonsoft.Json;  
using System.Text;  
using System.Xml;  
using System.Collections;  
using System.Text.RegularExpressions;  
using System.Reflection;  
using WxPayAPI;  
using WeddingCarService.WXPay;  

namespace WeddingCarService.Controllers  
{  
    public class Wx_Pay_Model  
    {  
        public int retcode { get; set; }  
        public string retmsg { get; set; }  
        public string appid { get; set; }  
        public string noncestr { get; set; }  
        public string package { get; set; }  
        public string partnerid { get; set; }  
        public string prepayid { get; set; }  
        public string timestamp { get; set; }  
        public string sign { get; set; }  
    }  
    public class wxPayController : Controller  
    {  

        public static string mchid = "11111"; //mchid  
        public static string appId = "11111"; //appid  
        public static string appsecret = "11111"; //appsecret  
        public static string appkey = "11111"; //paysignkey(非appkey 在微信商户平台设置 (md5)111111111111)    
        public static string notify_url = Common.CommonDefine.ServerPath + "/wxpay/wxtNotify"; //支付完成后的回调处理页面  
        //  
        // GET: /wxPay/  

        public ActionResult Index()  
        {  
            return View();  
        }  

        /// <summary>  
        /// 微信支付主体接口  
        /// </summary>  
        /// <returns></returns>  
        public ActionResult wxpay()  
        {  
            //************************************************支付参数接收********************************  
            ///获取金额  
            string amount = Request.QueryString["_amount"];  
            string sp_billno = string.IsNullOrEmpty(Request.QueryString["_orderid"]) ? DateTime.Now.ToString("yyyyMMddhhmmssffff") : Request.QueryString["_orderid"];  
            string detail = Request.QueryString["_detail"];  
            double dubamount;  
            double.TryParse(amount, out dubamount);  
            //根据appid和appappsecret获取refresh_token  
            //string url_token = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appId, appsecret);  
            //string returnStr = tokenservice.GetToken(appId, appsecret);  
            //时间戳  
            var timeStamp = TenpayUtil.getTimestamp();  
            //随机验证码  
            var nonceStr = TenpayUtil.getNoncestr();  

            //****************************************************************获取预支付订单编号***********************  
            //设置package订单参数  
            Hashtable packageParameter = new Hashtable();  
            packageParameter.Add("appid", appId);//开放账号ID    
            packageParameter.Add("mch_id", mchid); //商户号  
            packageParameter.Add("nonce_str", nonceStr); //随机字符串  
            packageParameter.Add("body", detail); //商品描述      
            packageParameter.Add("out_trade_no", sp_billno); //商家订单号   
            packageParameter.Add("total_fee", (dubamount*100).ToString()); //商品金额,以分为单位      
            packageParameter.Add("spbill_create_ip", Request.UserHostAddress); //订单生成的机器IP,指用户浏览器端IP    
            packageParameter.Add("notify_url", notify_url); //接收财付通通知的URL    
            packageParameter.Add("trade_type", "APP");//交易类型    
            packageParameter.Add("fee_type", "CNY"); //币种,1人民币   66    
            //获取签名  
            var sign = CreateMd5Sign("key", appkey, packageParameter, Request.ContentEncoding.BodyName);  
            //拼接上签名  
            packageParameter.Add("sign", sign);  
            //生成加密包的XML格式字符串  
            string data = parseXML(packageParameter);  
            //调用统一下单接口,获取预支付订单号码  
            string prepayXml = HttpUtil.Send(data, "https://api.mch.weixin.qq.com/pay/unifiedorder");  

            //获取预支付ID  
            var prepayId = string.Empty;  
            var xdoc = new XmlDocument();  
            xdoc.LoadXml(prepayXml);  
            XmlNode xn = xdoc.SelectSingleNode("xml");  
            XmlNodeList xnl = xn.ChildNodes;  
            if (xnl.Count > 7)  
            {  
                prepayId = xnl[7].InnerText;  
            }  

            //**************************************************封装调起微信客户端支付界面字符串********************  
            //设置待加密支付参数并加密  
            Hashtable paySignReqHandler = new Hashtable();  
            paySignReqHandler.Add("appid", appId);  
            paySignReqHandler.Add("partnerid", mchid);  
            paySignReqHandler.Add("prepayid", prepayId);  
            paySignReqHandler.Add("package", "Sign=WXPay");  
            paySignReqHandler.Add("noncestr", nonceStr);  
            paySignReqHandler.Add("timestamp", timeStamp);  
            var paySign = CreateMd5Sign("key", appkey, paySignReqHandler, Request.ContentEncoding.BodyName);  

            //设置支付包参数  
            Wx_Pay_Model wxpaymodel = new Wx_Pay_Model();  
            wxpaymodel.retcode = 0;//5+固定调起参数  
            wxpaymodel.retmsg = "ok";//5+固定调起参数  
            wxpaymodel.appid = appId;//AppId,微信开放平台新建应用时产生  
            wxpaymodel.partnerid = mchid;//商户编号,微信开放平台申请微信支付时产生  
            wxpaymodel.prepayid = prepayId;//由上面获取预支付流程获取  
            wxpaymodel.package = "Sign=WXpay";//APP支付固定设置参数  
            wxpaymodel.noncestr = nonceStr;//随机字符串,  
            wxpaymodel.timestamp = timeStamp;//时间戳  
            wxpaymodel.sign = paySign;//上面关键参数加密获得  
            //将参数对象直接返回给客户端  
            return Json(new { msg = "", result = wxpaymodel }, JsonRequestBehavior.AllowGet);  
        }  

        /// <summary>  
        /// 将类对象拼接成调起支付字符串  
        /// </summary>  
        /// <param name="_model"></param>  
        /// <returns></returns>  
        private string ReSetPayString(Wx_Pay_Model _model)  
        {  
            StringBuilder strpay = new StringBuilder();  
            PropertyInfo[] props = _model.GetType().GetProperties();  
            strpay.Append("{");  
            foreach (PropertyInfo property in props)  
            {  
                strpay.Append(property.Name + ":\""+property.GetValue(_model, null).ToString()+"\",");  
            }  
            strpay.Remove(strpay.Length - 1, 1);  
            strpay.Append("}");  
            return strpay.ToString();  
        }  

        /// <summary>  
        /// 输出XML  
        /// </summary>  
        /// <returns></returns>  
        public string parseXML(Hashtable _parameters)  
        {  
            var sb = new StringBuilder();  
            sb.Append("<xml>");  
            var akeys = new ArrayList(_parameters.Keys);  
            foreach (string k in akeys)  
            {  
                var v = (string)_parameters[k];  
                if (Regex.IsMatch(v, @"^[0-9.]$"))  
                {  
                    sb.Append("<" + k + ">" + v + "</" + k + ">");  
                }  
                else  
                {  
                    sb.Append("<" + k + "><![CDATA[" + v + "]]></" + k + ">");  
                }  
            }  
            sb.Append("</xml>");  
            return sb.ToString();  
        }  

        /// <summary>  
        /// 创建package签名  
        /// </summary>  
        /// <param name="key">密钥键</param>  
        /// <param name="value">财付通商户密钥(自定义32位密钥)</param>  
        /// <returns></returns>  
        public virtual string CreateMd5Sign(string key, string value, Hashtable parameters, string _ContentEncoding)  
        {  
            var sb = new StringBuilder();  
            //数组化键值对,并排序  
            var akeys = new ArrayList(parameters.Keys);  
            akeys.Sort();  
            //循环拼接包参数  
            foreach (string k in akeys)  
            {  
                var v = (string)parameters[k];  
                if (null != v && "".CompareTo(v) != 0  
                    && "sign".CompareTo(k) != 0 && "key".CompareTo(k) != 0)  
                {  
                    sb.Append(k + "=" + v + "&");  
                }  
            }  
            //最后拼接商户自定义密钥  
            sb.Append(key + "=" + value);  
            //加密  
            string sign = MD5Util.GetMD5(sb.ToString(), _ContentEncoding).ToUpper();  
            //返回密文  
            return sign;  
        }  

        /// <summary>  
        /// 日志记录工具类  
        /// </summary>  
        /// <param name="pathWrite"></param>  
        /// <param name="content"></param>  
        public static void WriteFile(string pathWrite, string content)  
        {  
            try  
            {  
                if (System.IO.File.Exists(pathWrite))  
                {  
                    //System.IO.File.Delete(pathWrite);  
                }  
                else  
                {  
                    System.IO.File.Create(pathWrite);  
                }  
                System.IO.File.AppendAllText(pathWrite, content + "\r\n----------------------------------------\r\n",  
                    Encoding.GetEncoding("utf-8"));  
            }  
            catch (Exception e)  
            {  

            }  
        }  

        /// <summary>  
        /// 微信支付异步回调方法  
        /// </summary>  
        /// <returns></returns>  
        public ActionResult wxtNotify()  
        {  
            ResultNotify resultNotify = new ResultNotify(Request);  
            resultNotify.ProcessNotify();  
            return Json(new { msg = "成功" }, JsonRequestBehavior.AllowGet);  
        }  
    }  
}  

客户端代码:  
<!DOCTYPE html>  
<html>  

    <head>  
        <meta charset="utf-8">  
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />  
        <title></title>  
        <script src="js/mui.min.js"></script>  
        <link href="css/mui.min.css" rel="stylesheet" />  
        <script type="text/javascript" charset="utf-8">  
            mui.init();  
            var channel = null;  
            var channels = null;  
             // 1. 获取支付通道  
            function plusReady() {  
                // 获取支付通道  
                plus.payment.getChannels(function(cs) {  
                    channels = cs;  
                }, function(e) {  
                    alert("获取支付通道失败:" + e.message);  
                });  
            }  
            document.addEventListener('plusready', plusReady, false);  
            var ALIPAYSERVER = 'http://demo.dcloud.net.cn/helloh5/payment/alipay.php?total=';  
            var WXPAYSERVER = 'http://192.168.3.141/wxPay/wxpay';  
            /*var WXPAYSERVER = 'http://demo.dcloud.net.cn/payment/?payid=wxpay&appid=HBuilder&total=1';*/  
             // 2. 发起支付请求  
            function pay(id) {  
                // 从服务器请求支付订单  
                var PAYSERVER = '';  
                if (id == 'alipay') {  
                    PAYSERVER = ALIPAYSERVER;  
                } else if (id == 'wxpay') {  
                    PAYSERVER = WXPAYSERVER;  
                } else {  
                    plus.nativeUI.alert("不支持此支付通道!", null, "捐赠");  
                    return;  
                }  
                //获取支付通道  
                for (var i in channels) {  
                    if (channels[i].id == id) {  
                        channel = channels[i];  
                    }  
                }  
                mui.get(PAYSERVER, {  
                    _amount: 1,  
                    _orderid: "",  
                    _detail: "测试微信支付"  
                }, function(data) {  
                    var varpay = {  
                        retcode: 0,  
                        retmsg: "ok",  
                        appid: data.result.appid,  
                        noncestr: data.result.noncestr,  
                        package: "Sign=WXPay",  
                        partnerid: data.result.partnerid,  
                        prepayid: data.result.prepayid,  
                        timestamp: data.result.timestamp,  
                        sign: data.result.sign  
                    }  
                    plus.payment.request(channel, varpay, function(result) {  
                        plus.nativeUI.alert("支付成功!", function() {  
                            back();  
                        });  
                    }, function(e) {  
                        plus.nativeUI.alert("支付失败:" + e.code + "支付失败:" + e.message);  
                        console.log(e.code);  
                        console.log(e.message);  
                    });  
                }, "json");  
                var xhr = new XMLHttpRequest();  
                xhr.onreadystatechange = function() {  
                        switch (xhr.readyState) {  
                            case 4:  
                                if (xhr.status == 200) {  
                                    alert(xhr.result);  
                                    plus.payment.request(channel, xhr.result, function(result) {  
                                        plus.nativeUI.alert("支付成功!", function() {  
                                            back();  
                                        });  
                                    }, function(error) {  
                                        plus.nativeUI.alert("支付失败:" + error.code);  
                                    });  
                                } else {  
                                    alert("获取订单信息失败!");  
                                }  
                                break;  
                            default:  
                                break;  
                        }  
                    }  
                    /*          xhr.open('GET',PAYSERVER);  
                                xhr.send();*/  
            }  
        </script>  
    </head>  

    <body>  
        <header class="mui-bar mui-bar-nav">  
            <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>  
            <h1 class="mui-title">支付测试</h1>  
        </header>  
        <div class="mui-content">  
            <input type="button" class="btn btn-lg" id="pay" value="pay" onclick="pay('wxpay')" />  
        </div>  

    </body>  

</html>
继续阅读 »

研究了很多demo示例,最后整理出了如下的.net MVC版本的微信支付服务端代码,亲测可行,服务端所需要的其他类文件我已经打包存附件了,需要的可以下载使用
以下只实现了基础功能,如果有什么问题还请大神们多多指教。

服务端代码:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Web;  
using System.Web.Mvc;  
using WeddingCarService.Models;  
using Newtonsoft.Json;  
using System.Text;  
using System.Xml;  
using System.Collections;  
using System.Text.RegularExpressions;  
using System.Reflection;  
using WxPayAPI;  
using WeddingCarService.WXPay;  

namespace WeddingCarService.Controllers  
{  
    public class Wx_Pay_Model  
    {  
        public int retcode { get; set; }  
        public string retmsg { get; set; }  
        public string appid { get; set; }  
        public string noncestr { get; set; }  
        public string package { get; set; }  
        public string partnerid { get; set; }  
        public string prepayid { get; set; }  
        public string timestamp { get; set; }  
        public string sign { get; set; }  
    }  
    public class wxPayController : Controller  
    {  

        public static string mchid = "11111"; //mchid  
        public static string appId = "11111"; //appid  
        public static string appsecret = "11111"; //appsecret  
        public static string appkey = "11111"; //paysignkey(非appkey 在微信商户平台设置 (md5)111111111111)    
        public static string notify_url = Common.CommonDefine.ServerPath + "/wxpay/wxtNotify"; //支付完成后的回调处理页面  
        //  
        // GET: /wxPay/  

        public ActionResult Index()  
        {  
            return View();  
        }  

        /// <summary>  
        /// 微信支付主体接口  
        /// </summary>  
        /// <returns></returns>  
        public ActionResult wxpay()  
        {  
            //************************************************支付参数接收********************************  
            ///获取金额  
            string amount = Request.QueryString["_amount"];  
            string sp_billno = string.IsNullOrEmpty(Request.QueryString["_orderid"]) ? DateTime.Now.ToString("yyyyMMddhhmmssffff") : Request.QueryString["_orderid"];  
            string detail = Request.QueryString["_detail"];  
            double dubamount;  
            double.TryParse(amount, out dubamount);  
            //根据appid和appappsecret获取refresh_token  
            //string url_token = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appId, appsecret);  
            //string returnStr = tokenservice.GetToken(appId, appsecret);  
            //时间戳  
            var timeStamp = TenpayUtil.getTimestamp();  
            //随机验证码  
            var nonceStr = TenpayUtil.getNoncestr();  

            //****************************************************************获取预支付订单编号***********************  
            //设置package订单参数  
            Hashtable packageParameter = new Hashtable();  
            packageParameter.Add("appid", appId);//开放账号ID    
            packageParameter.Add("mch_id", mchid); //商户号  
            packageParameter.Add("nonce_str", nonceStr); //随机字符串  
            packageParameter.Add("body", detail); //商品描述      
            packageParameter.Add("out_trade_no", sp_billno); //商家订单号   
            packageParameter.Add("total_fee", (dubamount*100).ToString()); //商品金额,以分为单位      
            packageParameter.Add("spbill_create_ip", Request.UserHostAddress); //订单生成的机器IP,指用户浏览器端IP    
            packageParameter.Add("notify_url", notify_url); //接收财付通通知的URL    
            packageParameter.Add("trade_type", "APP");//交易类型    
            packageParameter.Add("fee_type", "CNY"); //币种,1人民币   66    
            //获取签名  
            var sign = CreateMd5Sign("key", appkey, packageParameter, Request.ContentEncoding.BodyName);  
            //拼接上签名  
            packageParameter.Add("sign", sign);  
            //生成加密包的XML格式字符串  
            string data = parseXML(packageParameter);  
            //调用统一下单接口,获取预支付订单号码  
            string prepayXml = HttpUtil.Send(data, "https://api.mch.weixin.qq.com/pay/unifiedorder");  

            //获取预支付ID  
            var prepayId = string.Empty;  
            var xdoc = new XmlDocument();  
            xdoc.LoadXml(prepayXml);  
            XmlNode xn = xdoc.SelectSingleNode("xml");  
            XmlNodeList xnl = xn.ChildNodes;  
            if (xnl.Count > 7)  
            {  
                prepayId = xnl[7].InnerText;  
            }  

            //**************************************************封装调起微信客户端支付界面字符串********************  
            //设置待加密支付参数并加密  
            Hashtable paySignReqHandler = new Hashtable();  
            paySignReqHandler.Add("appid", appId);  
            paySignReqHandler.Add("partnerid", mchid);  
            paySignReqHandler.Add("prepayid", prepayId);  
            paySignReqHandler.Add("package", "Sign=WXPay");  
            paySignReqHandler.Add("noncestr", nonceStr);  
            paySignReqHandler.Add("timestamp", timeStamp);  
            var paySign = CreateMd5Sign("key", appkey, paySignReqHandler, Request.ContentEncoding.BodyName);  

            //设置支付包参数  
            Wx_Pay_Model wxpaymodel = new Wx_Pay_Model();  
            wxpaymodel.retcode = 0;//5+固定调起参数  
            wxpaymodel.retmsg = "ok";//5+固定调起参数  
            wxpaymodel.appid = appId;//AppId,微信开放平台新建应用时产生  
            wxpaymodel.partnerid = mchid;//商户编号,微信开放平台申请微信支付时产生  
            wxpaymodel.prepayid = prepayId;//由上面获取预支付流程获取  
            wxpaymodel.package = "Sign=WXpay";//APP支付固定设置参数  
            wxpaymodel.noncestr = nonceStr;//随机字符串,  
            wxpaymodel.timestamp = timeStamp;//时间戳  
            wxpaymodel.sign = paySign;//上面关键参数加密获得  
            //将参数对象直接返回给客户端  
            return Json(new { msg = "", result = wxpaymodel }, JsonRequestBehavior.AllowGet);  
        }  

        /// <summary>  
        /// 将类对象拼接成调起支付字符串  
        /// </summary>  
        /// <param name="_model"></param>  
        /// <returns></returns>  
        private string ReSetPayString(Wx_Pay_Model _model)  
        {  
            StringBuilder strpay = new StringBuilder();  
            PropertyInfo[] props = _model.GetType().GetProperties();  
            strpay.Append("{");  
            foreach (PropertyInfo property in props)  
            {  
                strpay.Append(property.Name + ":\""+property.GetValue(_model, null).ToString()+"\",");  
            }  
            strpay.Remove(strpay.Length - 1, 1);  
            strpay.Append("}");  
            return strpay.ToString();  
        }  

        /// <summary>  
        /// 输出XML  
        /// </summary>  
        /// <returns></returns>  
        public string parseXML(Hashtable _parameters)  
        {  
            var sb = new StringBuilder();  
            sb.Append("<xml>");  
            var akeys = new ArrayList(_parameters.Keys);  
            foreach (string k in akeys)  
            {  
                var v = (string)_parameters[k];  
                if (Regex.IsMatch(v, @"^[0-9.]$"))  
                {  
                    sb.Append("<" + k + ">" + v + "</" + k + ">");  
                }  
                else  
                {  
                    sb.Append("<" + k + "><![CDATA[" + v + "]]></" + k + ">");  
                }  
            }  
            sb.Append("</xml>");  
            return sb.ToString();  
        }  

        /// <summary>  
        /// 创建package签名  
        /// </summary>  
        /// <param name="key">密钥键</param>  
        /// <param name="value">财付通商户密钥(自定义32位密钥)</param>  
        /// <returns></returns>  
        public virtual string CreateMd5Sign(string key, string value, Hashtable parameters, string _ContentEncoding)  
        {  
            var sb = new StringBuilder();  
            //数组化键值对,并排序  
            var akeys = new ArrayList(parameters.Keys);  
            akeys.Sort();  
            //循环拼接包参数  
            foreach (string k in akeys)  
            {  
                var v = (string)parameters[k];  
                if (null != v && "".CompareTo(v) != 0  
                    && "sign".CompareTo(k) != 0 && "key".CompareTo(k) != 0)  
                {  
                    sb.Append(k + "=" + v + "&");  
                }  
            }  
            //最后拼接商户自定义密钥  
            sb.Append(key + "=" + value);  
            //加密  
            string sign = MD5Util.GetMD5(sb.ToString(), _ContentEncoding).ToUpper();  
            //返回密文  
            return sign;  
        }  

        /// <summary>  
        /// 日志记录工具类  
        /// </summary>  
        /// <param name="pathWrite"></param>  
        /// <param name="content"></param>  
        public static void WriteFile(string pathWrite, string content)  
        {  
            try  
            {  
                if (System.IO.File.Exists(pathWrite))  
                {  
                    //System.IO.File.Delete(pathWrite);  
                }  
                else  
                {  
                    System.IO.File.Create(pathWrite);  
                }  
                System.IO.File.AppendAllText(pathWrite, content + "\r\n----------------------------------------\r\n",  
                    Encoding.GetEncoding("utf-8"));  
            }  
            catch (Exception e)  
            {  

            }  
        }  

        /// <summary>  
        /// 微信支付异步回调方法  
        /// </summary>  
        /// <returns></returns>  
        public ActionResult wxtNotify()  
        {  
            ResultNotify resultNotify = new ResultNotify(Request);  
            resultNotify.ProcessNotify();  
            return Json(new { msg = "成功" }, JsonRequestBehavior.AllowGet);  
        }  
    }  
}  

客户端代码:  
<!DOCTYPE html>  
<html>  

    <head>  
        <meta charset="utf-8">  
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />  
        <title></title>  
        <script src="js/mui.min.js"></script>  
        <link href="css/mui.min.css" rel="stylesheet" />  
        <script type="text/javascript" charset="utf-8">  
            mui.init();  
            var channel = null;  
            var channels = null;  
             // 1. 获取支付通道  
            function plusReady() {  
                // 获取支付通道  
                plus.payment.getChannels(function(cs) {  
                    channels = cs;  
                }, function(e) {  
                    alert("获取支付通道失败:" + e.message);  
                });  
            }  
            document.addEventListener('plusready', plusReady, false);  
            var ALIPAYSERVER = 'http://demo.dcloud.net.cn/helloh5/payment/alipay.php?total=';  
            var WXPAYSERVER = 'http://192.168.3.141/wxPay/wxpay';  
            /*var WXPAYSERVER = 'http://demo.dcloud.net.cn/payment/?payid=wxpay&appid=HBuilder&total=1';*/  
             // 2. 发起支付请求  
            function pay(id) {  
                // 从服务器请求支付订单  
                var PAYSERVER = '';  
                if (id == 'alipay') {  
                    PAYSERVER = ALIPAYSERVER;  
                } else if (id == 'wxpay') {  
                    PAYSERVER = WXPAYSERVER;  
                } else {  
                    plus.nativeUI.alert("不支持此支付通道!", null, "捐赠");  
                    return;  
                }  
                //获取支付通道  
                for (var i in channels) {  
                    if (channels[i].id == id) {  
                        channel = channels[i];  
                    }  
                }  
                mui.get(PAYSERVER, {  
                    _amount: 1,  
                    _orderid: "",  
                    _detail: "测试微信支付"  
                }, function(data) {  
                    var varpay = {  
                        retcode: 0,  
                        retmsg: "ok",  
                        appid: data.result.appid,  
                        noncestr: data.result.noncestr,  
                        package: "Sign=WXPay",  
                        partnerid: data.result.partnerid,  
                        prepayid: data.result.prepayid,  
                        timestamp: data.result.timestamp,  
                        sign: data.result.sign  
                    }  
                    plus.payment.request(channel, varpay, function(result) {  
                        plus.nativeUI.alert("支付成功!", function() {  
                            back();  
                        });  
                    }, function(e) {  
                        plus.nativeUI.alert("支付失败:" + e.code + "支付失败:" + e.message);  
                        console.log(e.code);  
                        console.log(e.message);  
                    });  
                }, "json");  
                var xhr = new XMLHttpRequest();  
                xhr.onreadystatechange = function() {  
                        switch (xhr.readyState) {  
                            case 4:  
                                if (xhr.status == 200) {  
                                    alert(xhr.result);  
                                    plus.payment.request(channel, xhr.result, function(result) {  
                                        plus.nativeUI.alert("支付成功!", function() {  
                                            back();  
                                        });  
                                    }, function(error) {  
                                        plus.nativeUI.alert("支付失败:" + error.code);  
                                    });  
                                } else {  
                                    alert("获取订单信息失败!");  
                                }  
                                break;  
                            default:  
                                break;  
                        }  
                    }  
                    /*          xhr.open('GET',PAYSERVER);  
                                xhr.send();*/  
            }  
        </script>  
    </head>  

    <body>  
        <header class="mui-bar mui-bar-nav">  
            <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>  
            <h1 class="mui-title">支付测试</h1>  
        </header>  
        <div class="mui-content">  
            <input type="button" class="btn btn-lg" id="pay" value="pay" onclick="pay('wxpay')" />  
        </div>  

    </body>  

</html>
收起阅读 »