【公告】关于升级到MacOSX10.11beta3用户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包升级后会导致部分功能失效的问题
问题现象
使用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监听蓝牙开关状态
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系统已经修复了。此问题过期
苹果官方已确认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的日历插件,史上最精简
正要用个日历插件,发现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> 收起阅读 »
关于guide的研究
[6.0.0.201506290132]新增App首次启动欢迎页,也就是mui项目中examples/guide.html
APP启动流程:
- APP启动打开启动页面,也就是splashscreen,可以在manifest.html中设置自动关闭或者手动关闭:代码视图中plus下的splashscreen,autoclose值为false即需要手动关闭,值为true即自动关闭;
- 进入设置的入口页面webview;在入口页面或者入口页面的子webview即APP启动后就执行js的webview中判断APP是否为第一次启动。如何判断呢?使用localStorage,这个很简单就不说了;若不是第一次打开,则需要使用plus.navigator.closeSplashscreen()来关闭启动画面;若为第一次打开,则进入guide.html,在guide.html加载完后需要关闭启动画面;
- guide.html跳转至入口页面;
在MUI demo中,判断是否为第一次启动APP的代码在入口页面index.html的子页面list.html中;
看demo时发现若是ios则设置全屏(显示顶部状态栏),我测试了下,ios和安卓都可以全屏,不知道hbcui1984为何这样写,我看了下好几个安卓APP的guide都不是全屏的;
关于在使用过程中出现的问题:
1.有的娃娃做出来之后表现是看到启动画面后先看到入口页面,然后才看到guide页面,这是因为未正确设置启动画面的关闭;
若有问题,请在评论中指出。
by 鑫花璐放
[6.0.0.201506290132]新增App首次启动欢迎页,也就是mui项目中examples/guide.html
APP启动流程:
- APP启动打开启动页面,也就是splashscreen,可以在manifest.html中设置自动关闭或者手动关闭:代码视图中plus下的splashscreen,autoclose值为false即需要手动关闭,值为true即自动关闭;
- 进入设置的入口页面webview;在入口页面或者入口页面的子webview即APP启动后就执行js的webview中判断APP是否为第一次启动。如何判断呢?使用localStorage,这个很简单就不说了;若不是第一次打开,则需要使用plus.navigator.closeSplashscreen()来关闭启动画面;若为第一次打开,则进入guide.html,在guide.html加载完后需要关闭启动画面;
- guide.html跳转至入口页面;
在MUI demo中,判断是否为第一次启动APP的代码在入口页面index.html的子页面list.html中;
看demo时发现若是ios则设置全屏(显示顶部状态栏),我测试了下,ios和安卓都可以全屏,不知道hbcui1984为何这样写,我看了下好几个安卓APP的guide都不是全屏的;
关于在使用过程中出现的问题:
1.有的娃娃做出来之后表现是看到启动画面后先看到入口页面,然后才看到guide页面,这是因为未正确设置启动画面的关闭;
若有问题,请在评论中指出。
by 鑫花璐放
WebSQL Demo 给大家参考
初学,发现没有WebSQL的资料(其实google 有很多), 于是写了一个Demo练手,也给没用过的一个参考吧。
WebSQL官方文档在此
发现Sqlite 没有删除某条记录的功能... 只能整表删除,谁知道怎么删除某一条记录吗?
加一个别人写的Html5SQL helper
html5sql
DEMO 在此
初学,发现没有WebSQL的资料(其实google 有很多), 于是写了一个Demo练手,也给没用过的一个参考吧。
WebSQL官方文档在此
发现Sqlite 没有删除某条记录的功能... 只能整表删除,谁知道怎么删除某一条记录吗?
加一个别人写的Html5SQL helper
html5sql
DEMO 在此
增量升级
增量升级的问题
增量、差量升级是H5的一个优势,现在被越来越多的引用采用。但是在使用H5 的增量升级的时候遇到一个问题。纠结我很长时间一直在找解决方案,而且严重影响了用户体验。
我遇到最主要的问题是:
当APP启动是出现升级页面,用户点击增量升级后不重新启动APP。
如果我们的页面中存在父子webview的时候,这个时候有一些业务webview在显示的时候会发现父webview丢失了,导致用户体验直线下降,正常业务无法走通。
在尝试了很多方法后找到了一个解决方案。目前测试下来一切正常,但是可能测试的方法不全面。希望提出来对大家有所帮助
解决方案
其实解决方法很简单,就是关闭所有webview,然后再执行plus.runtime.restart();。下面是我的代码
var wvs=plus.webview.all();
for(var i=0;i<wvs.length;i ){
if(plus.webview.currentWebview().id!=wvs[i].id){
plus.webview.close(wvs[i]);
}
}
plus.runtime.restart();
本人不善言语,希望大家有更好的方法可以提出来,方便大家借鉴。
增量升级的问题
增量、差量升级是H5的一个优势,现在被越来越多的引用采用。但是在使用H5 的增量升级的时候遇到一个问题。纠结我很长时间一直在找解决方案,而且严重影响了用户体验。
我遇到最主要的问题是:
当APP启动是出现升级页面,用户点击增量升级后不重新启动APP。
如果我们的页面中存在父子webview的时候,这个时候有一些业务webview在显示的时候会发现父webview丢失了,导致用户体验直线下降,正常业务无法走通。
在尝试了很多方法后找到了一个解决方案。目前测试下来一切正常,但是可能测试的方法不全面。希望提出来对大家有所帮助
解决方案
其实解决方法很简单,就是关闭所有webview,然后再执行plus.runtime.restart();。下面是我的代码
var wvs=plus.webview.all();
for(var i=0;i<wvs.length;i ){
if(plus.webview.currentWebview().id!=wvs[i].id){
plus.webview.close(wvs[i]);
}
}
plus.runtime.restart();
本人不善言语,希望大家有更好的方法可以提出来,方便大家借鉴。
收起阅读 »








