HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

调试贼方便

控制台调试

移动Web开发过程中,在真机测试时,往往会遇到一些PC调试无法重现的问题,这时候我们需要在手机上拦截错误,并有相应的输出。

公司和网上都有类似的工具/类库,但如果纯粹一个简单的调试,或许不需要引入工具或类库,我们只需要知道全局拦截的原理。

其实很简单,就是window.onerror

语法:
复制代码
onerror=handleErr

function handleErr(msg,url,l)
{
//Handle the error here
return true or false
}

浏览器是否显示标准的错误消息,取决于 onerror 的返回值。如果返回值为 false,则在控制台 (JavaScript console) 中显示错误消息。反之则不会。

实例:
下面的例子展示如何使用 onerror 事件来捕获错误:

<html>  
<head>  
<script type="text/javascript">  
onerror=handleErr  
var txt=""  

function handleErr(msg,url,l)  
{  
txt="There was an error on this page.\n\n"  
txt+="Error: " + msg + "\n"  
txt+="URL: " + url + "\n"  
txt+="Line: " + l + "\n\n"  
txt+="Click OK to continue.\n\n"  
alert(txt)  
return true  
}  

function message()  
{  
adddlert("Welcome guest!")  
}  
</script>  
</head>  

<body>  
<input type="button" value="View message" onclick="message()" />  
</body>  

</html>
继续阅读 »

移动Web开发过程中,在真机测试时,往往会遇到一些PC调试无法重现的问题,这时候我们需要在手机上拦截错误,并有相应的输出。

公司和网上都有类似的工具/类库,但如果纯粹一个简单的调试,或许不需要引入工具或类库,我们只需要知道全局拦截的原理。

其实很简单,就是window.onerror

语法:
复制代码
onerror=handleErr

function handleErr(msg,url,l)
{
//Handle the error here
return true or false
}

浏览器是否显示标准的错误消息,取决于 onerror 的返回值。如果返回值为 false,则在控制台 (JavaScript console) 中显示错误消息。反之则不会。

实例:
下面的例子展示如何使用 onerror 事件来捕获错误:

<html>  
<head>  
<script type="text/javascript">  
onerror=handleErr  
var txt=""  

function handleErr(msg,url,l)  
{  
txt="There was an error on this page.\n\n"  
txt+="Error: " + msg + "\n"  
txt+="URL: " + url + "\n"  
txt+="Line: " + l + "\n\n"  
txt+="Click OK to continue.\n\n"  
alert(txt)  
return true  
}  

function message()  
{  
adddlert("Welcome guest!")  
}  
</script>  
</head>  

<body>  
<input type="button" value="View message" onclick="message()" />  
</body>  

</html>
收起阅读 »

封装了一个H5+的截屏后保存至系统相册的函数

相册 截屏
void save(successCB[,errorCB,fileName,imgID,overwrite,format,quality,clip]);

使用说明:

使用前需要等plusready事件发生后才能正常使用,否则可能会报错。

参数说明:

successCB:Function,成功回调函数 必填
errorCB :Function,失败回调函数
fileName :String ,文件名 不需后缀名。 默认当前时间戳
imgID :String ,原生图片ID。默认当前时间戳
overwrite :Boolean ,是否覆盖。默认为true
format :String ,保存的格式。默认PNG
quality :Number ,保存质量。值为1-100,1最低,100最高,默认50
clip :Object ,指定截屏区域。默认{top:'0px',left:'0px',width:'100%',height:'100%'}

具体代码,已上传附件

欢迎大佬指正

var save = function(successCB,errorCB,fileName,imgID,overwrite,format,quality,clip){  
        errorCB     =  errorCB   || function(){};  
        fileName    =  fileName  || Date.parse( new Date());  
        imgID           =    imgID       || String(Date.parse( new Date()));  
        overwrite =  overwrite || true;  
        format      =  format    || 'png';  
        quality     =  quality   || 50;  
        clip            =  clip      || {top:'0px',left:'0px',width:'100%',height:'100%'};  

        var self = plus.webview.currentWebview();  
        var bitmap = new plus.nativeObj.Bitmap(imgID);  

        //绘制截图  
        self.draw(bitmap,function(){  
                // 保存Bitmap图片  
         bitmap.save('_doc/'+fileName+'.'+format, {overwrite: overwrite,format:format,quality:quality,clip:clip}  
            , function(i) {  
                        //保存到系统相册  
                        plus.gallery.save(i.target,function(d){  
                                //销毁Bitmap图片  
                                bitmap.clear();  
                                successCB({success:'success',details:d});  
                        }, function(e){  
                                //销毁Bitmap图片  
                                bitmap.clear();  
                                errorCB({error:'图片保存至相册失败',details:e});  
                        });  
                }, function(e) {  
                        bitmap.clear();  
                        errorCB({error:'图片保存失败',details:e});  
                }  
            );  

        },function(e){  
                errorCB({error:'截屏绘制失败',details:e});  
        });  
}  
继续阅读 »
void save(successCB[,errorCB,fileName,imgID,overwrite,format,quality,clip]);

使用说明:

使用前需要等plusready事件发生后才能正常使用,否则可能会报错。

参数说明:

successCB:Function,成功回调函数 必填
errorCB :Function,失败回调函数
fileName :String ,文件名 不需后缀名。 默认当前时间戳
imgID :String ,原生图片ID。默认当前时间戳
overwrite :Boolean ,是否覆盖。默认为true
format :String ,保存的格式。默认PNG
quality :Number ,保存质量。值为1-100,1最低,100最高,默认50
clip :Object ,指定截屏区域。默认{top:'0px',left:'0px',width:'100%',height:'100%'}

具体代码,已上传附件

欢迎大佬指正

var save = function(successCB,errorCB,fileName,imgID,overwrite,format,quality,clip){  
        errorCB     =  errorCB   || function(){};  
        fileName    =  fileName  || Date.parse( new Date());  
        imgID           =    imgID       || String(Date.parse( new Date()));  
        overwrite =  overwrite || true;  
        format      =  format    || 'png';  
        quality     =  quality   || 50;  
        clip            =  clip      || {top:'0px',left:'0px',width:'100%',height:'100%'};  

        var self = plus.webview.currentWebview();  
        var bitmap = new plus.nativeObj.Bitmap(imgID);  

        //绘制截图  
        self.draw(bitmap,function(){  
                // 保存Bitmap图片  
         bitmap.save('_doc/'+fileName+'.'+format, {overwrite: overwrite,format:format,quality:quality,clip:clip}  
            , function(i) {  
                        //保存到系统相册  
                        plus.gallery.save(i.target,function(d){  
                                //销毁Bitmap图片  
                                bitmap.clear();  
                                successCB({success:'success',details:d});  
                        }, function(e){  
                                //销毁Bitmap图片  
                                bitmap.clear();  
                                errorCB({error:'图片保存至相册失败',details:e});  
                        });  
                }, function(e) {  
                        bitmap.clear();  
                        errorCB({error:'图片保存失败',details:e});  
                }  
            );  

        },function(e){  
                errorCB({error:'截屏绘制失败',details:e});  
        });  
}  
收起阅读 »

投资微信小程序都有哪些方面的优势呢

微信小程序

  最近微信小程序一下子火爆全国,不少人来询问关于微信小程序的开发问题,大家好奇的就是开发一个微信小程序难不难、要花多少时间、要花多少钱、要找什么样的团队做才放心等等,诸如此类的问题,可以说每天微信小程序开发公司都会收到,那么下面就一一为各位解答一下吧。

  微信小程序的价格,应该包含的是开发、上线、流畅的使用和后期的服务和更新,而不是一锤子买卖。所以在询问价格时应该确认“是否会有售后服务,售后服务是否包括产品优化、功能更新”。至少,上线了是能做到这一点的。不同的微信小程序有不同的功能,电商企业需要电商类微信小程序,美发美容按摩家政等需要服务预定类微信小程序,餐厅酒吧需要点餐类微信小程序,酒店民宿旅社需要酒店预定类微信小程序。

  微信小程序没有开发app难,开发到上线最短只需要3-7个工作日。尤其是目前很多公司利用微信小程序编辑器来开发之后,微信小程序的开发就跟网站建设一样,变成了一件非常简单、无需基础的事情。最短只需要10分钟,就能开发出好看、好用、优雅的微信小程序了。不过这类小程序往往存在很多隐形弊端,所以开始建议做定制开发,不过所花费的时间也不会太长。

  确定微信小程序的开发目的。由于类别和需求出发点不同,比如电商微信小程序和预约服务类微信小程序,用途也是不一样的。当然,也可以选择用电商微信小程序来售卖服务,但是这样就会牺牲一部分的用户体验。有利的是,这些类型的微信小程序价格都是一样的,仅需3000多元人民币一年。

  微信小程序不是所有都需要付费。首先,必须要明确一个概念:有的微信小程序是免费的,完全免费的。上线了打造的文章类微信小程序,就是给所有自媒体人的一个福利。整个制作过程流畅透明,所见即所得,什么都不需要懂,会写文章,就能开发微信小程序。这款微信小程序针对所有用户,免费开放。只需要注册成为上线了的用户,在后台制作一款文章类微信小程序即可。本文由专业的微信小程序开发公司燚轩科技整理发布,如需转载请注明出处。

继续阅读 »

  最近微信小程序一下子火爆全国,不少人来询问关于微信小程序的开发问题,大家好奇的就是开发一个微信小程序难不难、要花多少时间、要花多少钱、要找什么样的团队做才放心等等,诸如此类的问题,可以说每天微信小程序开发公司都会收到,那么下面就一一为各位解答一下吧。

  微信小程序的价格,应该包含的是开发、上线、流畅的使用和后期的服务和更新,而不是一锤子买卖。所以在询问价格时应该确认“是否会有售后服务,售后服务是否包括产品优化、功能更新”。至少,上线了是能做到这一点的。不同的微信小程序有不同的功能,电商企业需要电商类微信小程序,美发美容按摩家政等需要服务预定类微信小程序,餐厅酒吧需要点餐类微信小程序,酒店民宿旅社需要酒店预定类微信小程序。

  微信小程序没有开发app难,开发到上线最短只需要3-7个工作日。尤其是目前很多公司利用微信小程序编辑器来开发之后,微信小程序的开发就跟网站建设一样,变成了一件非常简单、无需基础的事情。最短只需要10分钟,就能开发出好看、好用、优雅的微信小程序了。不过这类小程序往往存在很多隐形弊端,所以开始建议做定制开发,不过所花费的时间也不会太长。

  确定微信小程序的开发目的。由于类别和需求出发点不同,比如电商微信小程序和预约服务类微信小程序,用途也是不一样的。当然,也可以选择用电商微信小程序来售卖服务,但是这样就会牺牲一部分的用户体验。有利的是,这些类型的微信小程序价格都是一样的,仅需3000多元人民币一年。

  微信小程序不是所有都需要付费。首先,必须要明确一个概念:有的微信小程序是免费的,完全免费的。上线了打造的文章类微信小程序,就是给所有自媒体人的一个福利。整个制作过程流畅透明,所见即所得,什么都不需要懂,会写文章,就能开发微信小程序。这款微信小程序针对所有用户,免费开放。只需要注册成为上线了的用户,在后台制作一款文章类微信小程序即可。本文由专业的微信小程序开发公司燚轩科技整理发布,如需转载请注明出处。

收起阅读 »

MUI同一个页面无法使用多个下拉/上拉刷新的问题(非父子Webview方式)

//只有一次调用
/mui.init({
pullRefresh: {
container: '#pullrefresh',
down: {
callback: pulldownRefresh
},
up: {
contentrefresh: '正在加载...',
callback: pullupRefresh
}
}
});
/
//下面的书写方式可多次调用
mui("#pullrefresh").pullRefresh({
up: {
contentrefresh: '正在加载...',
callback: pullupRefresh
},
})

继续阅读 »

//只有一次调用
/mui.init({
pullRefresh: {
container: '#pullrefresh',
down: {
callback: pulldownRefresh
},
up: {
contentrefresh: '正在加载...',
callback: pullupRefresh
}
}
});
/
//下面的书写方式可多次调用
mui("#pullrefresh").pullRefresh({
up: {
contentrefresh: '正在加载...',
callback: pullupRefresh
},
})

收起阅读 »

【分享经验】判断APP是否连接上网络

网络权限

废话不多说,直接上代码

function isNetWork() {  
    var NetStateStr = '未知';  
    var types = {};  
    types[plus.networkinfo.CONNECTION_UNKNOW] = "未知";  
    types[plus.networkinfo.CONNECTION_NONE] = "未连接网络";  
    types[plus.networkinfo.CONNECTION_ETHERNET] = "有线网络";  
    types[plus.networkinfo.CONNECTION_WIFI] = "WiFi网络";  
    types[plus.networkinfo.CONNECTION_CELL2G] = "2G蜂窝网络";  
    types[plus.networkinfo.CONNECTION_CELL3G] = "3G蜂窝网络";  
    types[plus.networkinfo.CONNECTION_CELL4G] = "4G蜂窝网络";  
    NetStateStr = types[plus.networkinfo.getCurrentType()];  
    return (NetStateStr === "未知") || (NetStateStr === "未连接网络") ? false : true;  
}  
mui.plusReady(function () {  
        if(!isNetWork()){  
            mui.toast('没有网络~');  
        }  
});  
继续阅读 »

废话不多说,直接上代码

function isNetWork() {  
    var NetStateStr = '未知';  
    var types = {};  
    types[plus.networkinfo.CONNECTION_UNKNOW] = "未知";  
    types[plus.networkinfo.CONNECTION_NONE] = "未连接网络";  
    types[plus.networkinfo.CONNECTION_ETHERNET] = "有线网络";  
    types[plus.networkinfo.CONNECTION_WIFI] = "WiFi网络";  
    types[plus.networkinfo.CONNECTION_CELL2G] = "2G蜂窝网络";  
    types[plus.networkinfo.CONNECTION_CELL3G] = "3G蜂窝网络";  
    types[plus.networkinfo.CONNECTION_CELL4G] = "4G蜂窝网络";  
    NetStateStr = types[plus.networkinfo.getCurrentType()];  
    return (NetStateStr === "未知") || (NetStateStr === "未连接网络") ? false : true;  
}  
mui.plusReady(function () {  
        if(!isNetWork()){  
            mui.toast('没有网络~');  
        }  
});  
收起阅读 »

如何做好一款app软件,这几点需要清楚

5 App开发

  很多企业投资者不清楚app开发有什么好处,为什么有些app软件能盈利,而有些app软件却根本无人使用,其实这就涉及到了app开发过程中的一些需求要点了,对于郑州app开发公司来说,制作一款app软件很简单,只需要知道投资者的实际需求及想要的功能就可以了,但是对于投资者来说,需要有一个好的需求想法才行,具体应该想到那些问题呢?下面就来说一下。

  1、生活需要:即时满意大家生计和日子的日常根底所需,如吃穿住用行等。像根据美食的群众点评,公交攻略的百度公交,供给日子综合效劳的58同城,都在点点滴滴为咱们的日子供给便捷。满意生理需要的APP,平时都不温不火,简直没有什么能够炒作的论题。

  3、交际需要:交际包含友谊、爱情、亲情等多个层次。或许能够分为熟人交际,陌生人交际等。当然两者也能够彼此转化。沟通和沟通,是人类永恒的主题。

  2、安全需要:这类需要如对健康的忧虑、对贫穷的惊骇、对无知的忧心,都是缺少安全感的体现,在安全感缺乏的一起,则心里驱动会促进去满意获取安全感的需要。如由于对贫穷的惊骇,则发生理财有关的需要,期望疾速的以钱生钱到达充足的意图。因之,各类出资理财软件层出不穷。

  4、尊敬需要:每个人都有被尊敬的需要,都期望展现自个,取得大家认可。信赖和认可,这也更多的体现在交际过程当中。每一个人的尊敬与被尊敬都存在于在交际网络中沟通互动当中。所以,尊敬需要能够深度暗合在交际需要当中。

  任何一款APP软件若要深入人心,必要深谙人道。需要区别明白人类外表需要及潜在需要。只要掌握了人道深处的需要,才能让APP植入用户的灵魂深处,让用户长久的使用下去,所以想要做好一款app软件,并不仅仅只是找一家app开发公司就可以了,还需要将app开发的重点给凸显出来才行。
信息由专业的郑州app开发公司燚轩科技整理发布,如需转载请注明出处。

继续阅读 »

  很多企业投资者不清楚app开发有什么好处,为什么有些app软件能盈利,而有些app软件却根本无人使用,其实这就涉及到了app开发过程中的一些需求要点了,对于郑州app开发公司来说,制作一款app软件很简单,只需要知道投资者的实际需求及想要的功能就可以了,但是对于投资者来说,需要有一个好的需求想法才行,具体应该想到那些问题呢?下面就来说一下。

  1、生活需要:即时满意大家生计和日子的日常根底所需,如吃穿住用行等。像根据美食的群众点评,公交攻略的百度公交,供给日子综合效劳的58同城,都在点点滴滴为咱们的日子供给便捷。满意生理需要的APP,平时都不温不火,简直没有什么能够炒作的论题。

  3、交际需要:交际包含友谊、爱情、亲情等多个层次。或许能够分为熟人交际,陌生人交际等。当然两者也能够彼此转化。沟通和沟通,是人类永恒的主题。

  2、安全需要:这类需要如对健康的忧虑、对贫穷的惊骇、对无知的忧心,都是缺少安全感的体现,在安全感缺乏的一起,则心里驱动会促进去满意获取安全感的需要。如由于对贫穷的惊骇,则发生理财有关的需要,期望疾速的以钱生钱到达充足的意图。因之,各类出资理财软件层出不穷。

  4、尊敬需要:每个人都有被尊敬的需要,都期望展现自个,取得大家认可。信赖和认可,这也更多的体现在交际过程当中。每一个人的尊敬与被尊敬都存在于在交际网络中沟通互动当中。所以,尊敬需要能够深度暗合在交际需要当中。

  任何一款APP软件若要深入人心,必要深谙人道。需要区别明白人类外表需要及潜在需要。只要掌握了人道深处的需要,才能让APP植入用户的灵魂深处,让用户长久的使用下去,所以想要做好一款app软件,并不仅仅只是找一家app开发公司就可以了,还需要将app开发的重点给凸显出来才行。
信息由专业的郑州app开发公司燚轩科技整理发布,如需转载请注明出处。

收起阅读 »

WebSocket与Socket、TCP、HTTP的关系和异同点

Socket.io WEBSOCKET

uniapp websocket体验demo:https://ext.dcloud.net.cn/plugin?id=1334

今天来讲一下与其他协议的区别和相同点,让各位同学能够更加深入的去了解和运用各种协议。
1 什么是WebSocket?
WebSocket从满足基于Web的日益增长的实时通信需求应运而生,解决了客户端发起多个Http请求到服务器资源浏览器必须要在经过长时间的轮询问题,实现里多路复用,是全双工、双向、单套接字连接,在WebSocket协议下服务器和客户端可以同时发送信息。

2 WebSocket和Http的异同点
同:1建立在TCP之上,通过TCP协议来传输数据。
2 都是可靠性传输协议。
3 都是应用层协议。
异:1 WebSocket是HTML5中的协议,支持持久连接,HTTP不支持持久连接
2 HTTP是单向协议,只能由客户端发起,做不到服务器主动向客户端推送信息。

3 WebSocket和Socket
Socket本身并不是一个协议,它工作在OSI模型会话层,是一个套接字,TCP/IP网络的API,是为了方便大家直接使用更底层协议而存在的一个抽象层。Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
而WebSocket则是一个典型的应用层协议。

4 WebSocket HTTP和TCP/IP
WebSocket和HTTP一样,都是建立在TCP之上,通过TCP来传输数据。后面的文章我会用代码举例子来展示。

5 Socket和TCP/IP 
 Socket是对TCP/IP协议的封装,像创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。
说了这么多,希望对大家来理解WebSocket与Socket、TCP、HTTP的关系有所帮助,如果大家在工作当中需要用到WebSocket而不能解决问题的时候,建议大家可以使用一下一些三方的WebSocket,融云、极光、GoEasy等,我这里就给大家推一个简单免费的三方WebSocket,。很成熟的一款产品,推荐原因是代码简单,运行稳定。网站是,大家可以自己去看一下。下篇文章我会用代码来举例说明这篇文章没有具体说的地方。

继续阅读 »

uniapp websocket体验demo:https://ext.dcloud.net.cn/plugin?id=1334

今天来讲一下与其他协议的区别和相同点,让各位同学能够更加深入的去了解和运用各种协议。
1 什么是WebSocket?
WebSocket从满足基于Web的日益增长的实时通信需求应运而生,解决了客户端发起多个Http请求到服务器资源浏览器必须要在经过长时间的轮询问题,实现里多路复用,是全双工、双向、单套接字连接,在WebSocket协议下服务器和客户端可以同时发送信息。

2 WebSocket和Http的异同点
同:1建立在TCP之上,通过TCP协议来传输数据。
2 都是可靠性传输协议。
3 都是应用层协议。
异:1 WebSocket是HTML5中的协议,支持持久连接,HTTP不支持持久连接
2 HTTP是单向协议,只能由客户端发起,做不到服务器主动向客户端推送信息。

3 WebSocket和Socket
Socket本身并不是一个协议,它工作在OSI模型会话层,是一个套接字,TCP/IP网络的API,是为了方便大家直接使用更底层协议而存在的一个抽象层。Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
而WebSocket则是一个典型的应用层协议。

4 WebSocket HTTP和TCP/IP
WebSocket和HTTP一样,都是建立在TCP之上,通过TCP来传输数据。后面的文章我会用代码举例子来展示。

5 Socket和TCP/IP 
 Socket是对TCP/IP协议的封装,像创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。
说了这么多,希望对大家来理解WebSocket与Socket、TCP、HTTP的关系有所帮助,如果大家在工作当中需要用到WebSocket而不能解决问题的时候,建议大家可以使用一下一些三方的WebSocket,融云、极光、GoEasy等,我这里就给大家推一个简单免费的三方WebSocket,。很成熟的一款产品,推荐原因是代码简单,运行稳定。网站是,大家可以自己去看一下。下篇文章我会用代码来举例说明这篇文章没有具体说的地方。

收起阅读 »

微信支付和支付宝支付接口回调函数的判断

微信支付

  微信支付和支付宝支付接口是现在网络商城必不可少的功能,有些网站不只一处需要对接这样同一个接口,不同的功能,传的参数不一样,但是回调只有一个,针对这样的问题,我们在回调函数里就需要进行判断了,判断是那个功能模块传过来的参数,来进行处理后续问题。下面就来为大家分析解答一下。

  主要实现代码如下:
接口1:
public function wxpay(){
header("Content-type:text/html;charset=utf-8");
$order_sn=I("order_sn");
$fa_need=M('fa_need');
$list=$fa_need->where("order_sn=$order_sn")->find();
$type=$list['type'];
$price=$list['need_salary'];
ini_set('date.timezone','Asia/Shanghai');
$time = date('Y-m-d');
vendor("WxPayPubHelper.lib.WxPay#Api");
$uid=session("uid");
$user=M("user");
$userinfo=$user->where("uid=$uid")->find();

$openid=$userinfo['openid'];
$data=$type.';'.'1'.';'.$order_sn;
//②、统一下单
$input = new \WxPayUnifiedOrder();

// dump($input);die;
$input->SetBody('欧克帮');
$input->SetAttach($data);
$input->SetOut_trade_no($order_sn); //商户号加上年月日十分秒 订单号
$input->SetTotal_fee($price);
// $input->SetTotal_fee(1);
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetGoods_tag($data);
$input->SetNotify_url("http://www.okxiaoyuan.com/Task/updateYanbao");
$input->SetTrade_type("JSAPI");
$input->SetOpenid($openid);

$order = \WxPayApi::unifiedOrder($input);

$jsApiParameters = $this->GetJsApiParameters($order);
// var_dump($jsApiParameters);exit;
$this->assign('price',$price);
$this->assign('order_sn',$order_sn);
$this->assign('openid',$openid);
$this->assign('jsApiParameters',$jsApiParameters);
$this->display();

}
接口2:
public function wxpay1(){
header("Content-type:text/html;charset=utf-8");
$uid=I("uid");
$user=M('user');
$list=$user->where("uid=$uid")->find();
$openid=$list['openid'];
$price=$list['pay_money'];
ini_set('date.timezone','Asia/Shanghai');
$time = date('Y-m-d');
vendor("WxPayPubHelper.lib.WxPay#Api");

$data=$type.';'.'2'.';'.$uid;
$order_sn=date("YmdHis",time()).rand(10000,99999);
//②、统一下单
$input = new \WxPayUnifiedOrder();

// dump($input);die;
$input->SetBody('欧克帮');
$input->SetAttach($data);
$input->SetOut_trade_no($order_sn); //商户号加上年月日十分秒 订单号
$input->SetTotal_fee($price*100);
//$input->SetTotal_fee(1);
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetGoods_tag($data);
$input->SetNotify_url("http://www.okxiaoyuan.com/User/updateYanbao");
$input->SetTrade_type("JSAPI");
$input->SetOpenid($openid);

$order = \WxPayApi::unifiedOrder($input);

$jsApiParameters = $this->GetJsApiParameters($order);
// var_dump($jsApiParameters);exit;
$this->assign('price',$price);
$this->assign('order_sn',$order_sn);
$this->assign('openid',$openid);
$this->assign('jsApiParameters',$jsApiParameters);
$this->display();

}
回调:
public function updateYanbao(){
$fileContent = file_get_contents("php://input");
//转换为simplexml对象
$xmlResult = simplexml_load_string($fileContent);
//$arr = json_decode(json_encode($xmlResult),TRUE);
//echo $xmlResult["age"]."//".$xmlResult->age;
if ($xmlResult->result_code=="SUCCESS") {
echo 'SUCCESS';
foreach($xmlResult->children() as $childItem){ //遍历所有节点数据
//输出xml节点名称和值
//echo $childItem->getName() . "->".$childItem."<br />";
//$res = $childItem->getName().":".$childItem.",".$res;
$datas = $childItem.",".$datas;
// $arr['"'.$childItem->getName().'"']=$childItem;
//其他操作省略
}
$varJson = $xmlResult->attach;
$varStr = explode(",", $varJson);
$str=$varStr[0];
$data=explode(';', $str);

    $type=$data[1];  
    if($type==1){  
    $order_sn = $data[2];  
    $model=M('fa_need');  
    $arr=$model->where("order_sn=$order_sn")->find();  
    $uid=$arr['uid'];  
  if($arr){  
  // $user=M("user");  
  // $userinfo=$user->where("uid=$uid")->find();  
  // if($arr['status']==1){  
  // $up['balance_money']=$userinfo['balance_money']+$arr['need_salary'];  
  // $user->where("uid=$uid")->save($up);  
  // }  
  $update1['needpay_state']=2;  
  $update1['status']=2;  
    if($model->where("order_sn=$order_sn")->save($update1)){  
    echo 'SUCCESS';  
    }  
  }  

    }  

    echo 'SUCCESS';  
}  

}

  看完之后估计大部分的程序技术人员应该很清楚是怎么一回事了吧,如果还存在有不理解的地方,大家可以留言咨询。

  本文由专业的郑州app开发公司燚轩科技整理发布,如需转载请注明出处。

继续阅读 »

  微信支付和支付宝支付接口是现在网络商城必不可少的功能,有些网站不只一处需要对接这样同一个接口,不同的功能,传的参数不一样,但是回调只有一个,针对这样的问题,我们在回调函数里就需要进行判断了,判断是那个功能模块传过来的参数,来进行处理后续问题。下面就来为大家分析解答一下。

  主要实现代码如下:
接口1:
public function wxpay(){
header("Content-type:text/html;charset=utf-8");
$order_sn=I("order_sn");
$fa_need=M('fa_need');
$list=$fa_need->where("order_sn=$order_sn")->find();
$type=$list['type'];
$price=$list['need_salary'];
ini_set('date.timezone','Asia/Shanghai');
$time = date('Y-m-d');
vendor("WxPayPubHelper.lib.WxPay#Api");
$uid=session("uid");
$user=M("user");
$userinfo=$user->where("uid=$uid")->find();

$openid=$userinfo['openid'];
$data=$type.';'.'1'.';'.$order_sn;
//②、统一下单
$input = new \WxPayUnifiedOrder();

// dump($input);die;
$input->SetBody('欧克帮');
$input->SetAttach($data);
$input->SetOut_trade_no($order_sn); //商户号加上年月日十分秒 订单号
$input->SetTotal_fee($price);
// $input->SetTotal_fee(1);
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetGoods_tag($data);
$input->SetNotify_url("http://www.okxiaoyuan.com/Task/updateYanbao");
$input->SetTrade_type("JSAPI");
$input->SetOpenid($openid);

$order = \WxPayApi::unifiedOrder($input);

$jsApiParameters = $this->GetJsApiParameters($order);
// var_dump($jsApiParameters);exit;
$this->assign('price',$price);
$this->assign('order_sn',$order_sn);
$this->assign('openid',$openid);
$this->assign('jsApiParameters',$jsApiParameters);
$this->display();

}
接口2:
public function wxpay1(){
header("Content-type:text/html;charset=utf-8");
$uid=I("uid");
$user=M('user');
$list=$user->where("uid=$uid")->find();
$openid=$list['openid'];
$price=$list['pay_money'];
ini_set('date.timezone','Asia/Shanghai');
$time = date('Y-m-d');
vendor("WxPayPubHelper.lib.WxPay#Api");

$data=$type.';'.'2'.';'.$uid;
$order_sn=date("YmdHis",time()).rand(10000,99999);
//②、统一下单
$input = new \WxPayUnifiedOrder();

// dump($input);die;
$input->SetBody('欧克帮');
$input->SetAttach($data);
$input->SetOut_trade_no($order_sn); //商户号加上年月日十分秒 订单号
$input->SetTotal_fee($price*100);
//$input->SetTotal_fee(1);
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetGoods_tag($data);
$input->SetNotify_url("http://www.okxiaoyuan.com/User/updateYanbao");
$input->SetTrade_type("JSAPI");
$input->SetOpenid($openid);

$order = \WxPayApi::unifiedOrder($input);

$jsApiParameters = $this->GetJsApiParameters($order);
// var_dump($jsApiParameters);exit;
$this->assign('price',$price);
$this->assign('order_sn',$order_sn);
$this->assign('openid',$openid);
$this->assign('jsApiParameters',$jsApiParameters);
$this->display();

}
回调:
public function updateYanbao(){
$fileContent = file_get_contents("php://input");
//转换为simplexml对象
$xmlResult = simplexml_load_string($fileContent);
//$arr = json_decode(json_encode($xmlResult),TRUE);
//echo $xmlResult["age"]."//".$xmlResult->age;
if ($xmlResult->result_code=="SUCCESS") {
echo 'SUCCESS';
foreach($xmlResult->children() as $childItem){ //遍历所有节点数据
//输出xml节点名称和值
//echo $childItem->getName() . "->".$childItem."<br />";
//$res = $childItem->getName().":".$childItem.",".$res;
$datas = $childItem.",".$datas;
// $arr['"'.$childItem->getName().'"']=$childItem;
//其他操作省略
}
$varJson = $xmlResult->attach;
$varStr = explode(",", $varJson);
$str=$varStr[0];
$data=explode(';', $str);

    $type=$data[1];  
    if($type==1){  
    $order_sn = $data[2];  
    $model=M('fa_need');  
    $arr=$model->where("order_sn=$order_sn")->find();  
    $uid=$arr['uid'];  
  if($arr){  
  // $user=M("user");  
  // $userinfo=$user->where("uid=$uid")->find();  
  // if($arr['status']==1){  
  // $up['balance_money']=$userinfo['balance_money']+$arr['need_salary'];  
  // $user->where("uid=$uid")->save($up);  
  // }  
  $update1['needpay_state']=2;  
  $update1['status']=2;  
    if($model->where("order_sn=$order_sn")->save($update1)){  
    echo 'SUCCESS';  
    }  
  }  

    }  

    echo 'SUCCESS';  
}  

}

  看完之后估计大部分的程序技术人员应该很清楚是怎么一回事了吧,如果还存在有不理解的地方,大家可以留言咨询。

  本文由专业的郑州app开发公司燚轩科技整理发布,如需转载请注明出处。

收起阅读 »

在父页面=打开子页面关闭父页面-打开父父页面刷新父父页面

index、a、b、c 四个页面
//index打开 a 为index
<html>
<head><title>index页</title> </head>
<body>
<div class="li">go-aa</div>
</body>
</html>

<script>  
mui.init();  
mui.plusReady(function() {  
    mui("body").on("tap",".li",index)  
    function indexclick(){    
         mui.openWindow({  
             url:'a.html',  
             id:'a'  
          });  
      }  
})  
</script>

//a打开 b 为A //会员中心
<html>
<head><title>a页</title> </head>
<body>
<div class="li">go-bb</div>
</body>
</html>

<script>  
mui.init();  
mui.plusReady(function() {  
    mui("body").on("tap",".li",index)  
    function indexclick(){    
         mui.openWindow({  
             url:'b.html',  
             id:'b'  
          });  
      }  
})  
</script>

//b打开 c 为B页面 // 找回密码
在B页面中 :
<html>
<head><title>b找回密码</title> </head>
<body>
<div class="li">go-cc</div>
</body>
</html>

<script>  
mui.init();  
mui.plusReady(function() {  
    mui("body").on("tap",".li",index)  
    function indexclick(){    
            var user_index=plus.webview.getWebviewById( "c");      
            if(user_index){  
                //alert("1")  //窗口存在  
                user_index.reload();  
                user_index.show();                                                            
            }else{   
                mui.openWindow({  
                    url: "c.html",   
                    id: "c",   
                    createNew: false  
                 })  
            }  
      }  
})  
</script>

在C页面中(登录) :
<html>
<head><title>c页登录</title> </head>
<body>
</body>
</html>

<script>  
mui.init();  
mui.plusReady(function() {  
                 //在父页面=打开子页面关闭父页面-打开父父页面  
                var page = plus.webview.currentWebview().opener().id;   //父类  

                if(page=='b'){  
                        //b是指从 B页面的 id  
                    plus.webview.currentWebview().opener().close();   //关闭 //父类  
                }else{  
                    plus.webview.currentWebview().opener().reload();  
                }  

              //刷新父父页面  
             var primaryBack = mui.back;  
             mui.back = function() {  
                   var wobj = plus.webview.getWebviewById("a");    //指A页面的id  
                   wobj.reload(true);  
                   primaryBack();  
                }  

})  
</script>  
继续阅读 »

index、a、b、c 四个页面
//index打开 a 为index
<html>
<head><title>index页</title> </head>
<body>
<div class="li">go-aa</div>
</body>
</html>

<script>  
mui.init();  
mui.plusReady(function() {  
    mui("body").on("tap",".li",index)  
    function indexclick(){    
         mui.openWindow({  
             url:'a.html',  
             id:'a'  
          });  
      }  
})  
</script>

//a打开 b 为A //会员中心
<html>
<head><title>a页</title> </head>
<body>
<div class="li">go-bb</div>
</body>
</html>

<script>  
mui.init();  
mui.plusReady(function() {  
    mui("body").on("tap",".li",index)  
    function indexclick(){    
         mui.openWindow({  
             url:'b.html',  
             id:'b'  
          });  
      }  
})  
</script>

//b打开 c 为B页面 // 找回密码
在B页面中 :
<html>
<head><title>b找回密码</title> </head>
<body>
<div class="li">go-cc</div>
</body>
</html>

<script>  
mui.init();  
mui.plusReady(function() {  
    mui("body").on("tap",".li",index)  
    function indexclick(){    
            var user_index=plus.webview.getWebviewById( "c");      
            if(user_index){  
                //alert("1")  //窗口存在  
                user_index.reload();  
                user_index.show();                                                            
            }else{   
                mui.openWindow({  
                    url: "c.html",   
                    id: "c",   
                    createNew: false  
                 })  
            }  
      }  
})  
</script>

在C页面中(登录) :
<html>
<head><title>c页登录</title> </head>
<body>
</body>
</html>

<script>  
mui.init();  
mui.plusReady(function() {  
                 //在父页面=打开子页面关闭父页面-打开父父页面  
                var page = plus.webview.currentWebview().opener().id;   //父类  

                if(page=='b'){  
                        //b是指从 B页面的 id  
                    plus.webview.currentWebview().opener().close();   //关闭 //父类  
                }else{  
                    plus.webview.currentWebview().opener().reload();  
                }  

              //刷新父父页面  
             var primaryBack = mui.back;  
             mui.back = function() {  
                   var wobj = plus.webview.getWebviewById("a");    //指A页面的id  
                   wobj.reload(true);  
                   primaryBack();  
                }  

})  
</script>  
收起阅读 »

mui 页面无法下滑拖拽 主要体现在华为手机浏览器

项目做到中期遇到一个问题,华为手机有些页面显示不全且无法下滑。

因为之前一直用的Google浏览器的模拟模式进行开发和调试的,一直未发现这个问题。

刚开始 选用mui的下拉刷新上拉加载的方式来进行页面配置。

忙活半天总算是把android的问题给解决了。然后转头去os上看看。果然ios又出问题了。

因为头部用的是原生的头部,下面主体内容又都用mui的mui-scroll-wrapper样式栝主了,

所以使用的时候反应迟钝、不流畅,根据无法正常使用。

接着又有传统方式写html发现在浏览器上是没有问题。问题原因浮现了。

然后我把相关的js和css全部加进来发现,果然不好使了。

经过排查原因找到了

原来是因为 mui.min.css 中设置了 touch-action: none;只需要把它删掉就好了

但因为下拉刷新上拉加载还需要这个属性。

所以我是直接把mui.min.css文件复制 一份,改个新的名称。

在不需要使用下拉刷新的页面引用这个新的mui样式就可以了。

如果嫌麻烦,则在不需要使用“下拉刷新” 的html页面,加上 * { touch-action:inherit; }

就可以解决问题了。

此博客是本人原创 未经允许不得转载 谢谢。

博客链接地址:http://www.cnblogs.com/richard-ju/p/L2018004.html

继续阅读 »

项目做到中期遇到一个问题,华为手机有些页面显示不全且无法下滑。

因为之前一直用的Google浏览器的模拟模式进行开发和调试的,一直未发现这个问题。

刚开始 选用mui的下拉刷新上拉加载的方式来进行页面配置。

忙活半天总算是把android的问题给解决了。然后转头去os上看看。果然ios又出问题了。

因为头部用的是原生的头部,下面主体内容又都用mui的mui-scroll-wrapper样式栝主了,

所以使用的时候反应迟钝、不流畅,根据无法正常使用。

接着又有传统方式写html发现在浏览器上是没有问题。问题原因浮现了。

然后我把相关的js和css全部加进来发现,果然不好使了。

经过排查原因找到了

原来是因为 mui.min.css 中设置了 touch-action: none;只需要把它删掉就好了

但因为下拉刷新上拉加载还需要这个属性。

所以我是直接把mui.min.css文件复制 一份,改个新的名称。

在不需要使用下拉刷新的页面引用这个新的mui样式就可以了。

如果嫌麻烦,则在不需要使用“下拉刷新” 的html页面,加上 * { touch-action:inherit; }

就可以解决问题了。

此博客是本人原创 未经允许不得转载 谢谢。

博客链接地址:http://www.cnblogs.com/richard-ju/p/L2018004.html

收起阅读 »

左侧向右,滑动关闭webview代码分享

JS方法

var rightClose = function(parview) {  
    //获得父窗口ID  
    var pws = plus.webview.getWebviewById(parview);  
    //获取当前窗口  
    var ws = plus.webview.currentWebview();  
    //监听当前侧滑窗口的右滑  
    ws.drag({  
        direction: 'right',  
        moveMode: 'followFinger'  
    }, {  
        view: pws.id,  
        moveMode: 'silent'  
    }, function(e) {  
        //滑动到end执行mui.back()事件  
        if(e.type == 'end' && e.result) {  
            mui.back();  
        }  
    });  
}

在子页面调用方法

mui.plusReady(function() {  
    rightClose('memadd');  
}); 

说明: memadd=当前页面的ID 也就是子页的ID

继续阅读 »

JS方法

var rightClose = function(parview) {  
    //获得父窗口ID  
    var pws = plus.webview.getWebviewById(parview);  
    //获取当前窗口  
    var ws = plus.webview.currentWebview();  
    //监听当前侧滑窗口的右滑  
    ws.drag({  
        direction: 'right',  
        moveMode: 'followFinger'  
    }, {  
        view: pws.id,  
        moveMode: 'silent'  
    }, function(e) {  
        //滑动到end执行mui.back()事件  
        if(e.type == 'end' && e.result) {  
            mui.back();  
        }  
    });  
}

在子页面调用方法

mui.plusReady(function() {  
    rightClose('memadd');  
}); 

说明: memadd=当前页面的ID 也就是子页的ID

收起阅读 »

用H5+开发的商城项目

新手练习实践中,希望可以多多提建议

新手练习实践中,希望可以多多提建议