blogs's Issues
小程序介绍
小程序的官方介绍
- 小程序导语
- 全新的开发能力
- 快速的开发
- 便捷的获取和传播
- 出色的用户体验
- 开放注册范围
企业、政府、媒体、其他组织(个人的只限个体工商户)
- 开发支持
- 开发文档
- 开发工具
- 设计规范
- 开发文档
- 官方文档链接
- 接入流程
注册、完善信息、开发小程序、上传源代码、提交审核发布
小程序的功能
- 提供的api有
网络: 发请求,文件的上传和下载,websocket相关的功能
媒体: 图片(选择,预览,获取),录音,音乐播放控制,音频播放控制
文件: 保存文件、获取保存的文件列表、获取保存的文件信息、删除文件、打开文件
数据的缓存: 增删改查(支持同步和异步)
位置: 获取和查看位置,地图组件的控制 设备: 设备系统信息,网络状况(2g,3g,4g,wifi),重力感应,罗盘,拨打电话,扫码
界面: 交互(toast、弹框、actionSheet)、控制导航条、
导航(或叫路由跳转)、动画、绘画(canvas)、下拉刷新
开放的接口: 登录,用户信息,微信支付,模板消息,客服消息(支持文本、图片、语音,分享
- 提供的组件
视图容器:view、scroll-view、swipe
基础内容:icon、text、progress
表单组件:button、checkbox、form、input、label、picker(selector)、picker-view、
radio、slider、switch、textarea
导航:(就像a标签)
媒体组件:audio、image、video
地图:map
画布:canvas
小程序的发展现状
- 小程序的入口找到了
扫二维码,搜索,来自朋友的转发,公众号的关联
后面二次入口:使用的历史记录,可以置在聊天顶部(只能置顶一个),可以从Android的手机桌面进入
- 现在小程序拥有的特点
- 使用小程序微信要更新至6.5.3以上版本
- 小而快,使用后短时间内再次次进入无需等待。
- 与公众号有关联,一个公众号可以关联5个小程序,一个小程序只能关联一个公众号。
- 小程序分享,分享的不是小程序应用,而分享的是小程序页
一个小程序能生成 10万个带参数二维码,就可以有10万个不同的小程序页,每个小程序页都可以单独分享出去。
- 1个营业执照能注册 50 个小程序
- 小程序是一个在微信上使用的新工具。可以通过这个新工具提供便捷的服务。
- 小程序更适合连接线下与线上,到线下的一个场景,想快速找到对应的线上的场景,通过扫一扫线下的二维码就能进入。
- 小程序提供接近PC时代网站的服务。
- 小程序有什么价值
对开发者,门槛要求低了,看看文档就可以进行开发了,
门槛很低了,如果要做的深和做的精,前期对前端技术要求还是很高的,后期成熟公司会开放出来很多不错的开源组件(就像jquery插件那样多)
- 对用户:可以不用装一些不常用的app了,并且使用小程序也很方便,不需要安装,只需等待几秒钟的加载时间
- 企业组织:又可以有波红利来了,并开发小程序的成本也低了。但对已经获得用户流量的移动应用会有冲击。
- 小程序做了些克制
- 自己不做小程序商店,其实可能会授权其他公司做商店,比如知晓程序。
- 自己不做搜索排名的事,现在不支持模糊搜索,除了自己品牌。
- 不能分享朋友圈,不做推广,和推荐。
- 官方的态度是小程序不可以做游戏
- 人们与小程序的关系
- 人们与小程序之间,不需要关注小程序,无粉丝,没有订阅关系,只有访问关系。
- 触手可及,无安装无卸载,用完即走。
- 有网友说使用小程序有种感觉叫“如丝般顺滑”
- 缩短了用户使用服务的路径
- 小程序有哪些未知
- 还不知道小程序会被玩成什么样,公众号的推出肯定也不是官方预想的那样。
- 小程序还不知道会有哪些改变
- 现在说的不做的不代表未来一定不做
小程序与native app恩与怨
- 小程序本质就是个混合开发,
- 开发模式就是hybrid混合开发
通过js调用native方法,或者直接使用微信提供的native组件,
现在混合开发模式有两种:js通过桥接与native通信,还有种就是像react native和weex框架的模式,直接使用native提供的组件
- 用户角度看小程序与app,
- 小程序和APP存在关联,可以借助微信联合登录,不会支持小程序和App直接的跳转。
- 小程序体验会接近app,理论上不会超越app,
但是或许可以比其他app体验会更好,因为微信帮你做的更好了- 用户可以像使用app一样使用小程序
- 开发者角度看小程序,
- 根据微信给出的规范,和开发文档,开发出来一个应用,
反正都是不停的而干活,用的工具不一样而已,
犹如java开发者跟php开发者。
又有了多学一门技术的‘机会’
- 公司对他们的冷与暖
- 开发小程序需要的开发成本很低,可能可以达到节省三分之二,因为开发app还需要Android和ios开发的两拨人,而且比其中任意一种开发都简单。
小程序与h5情与爱
- 开发小程序使用的技术是h5的技术
- css3 html5 JavaScript
- 但是h5很重要的技术被小程序拦截了,就是超链接,互联网web最常用的就是超链接,一个页面链接到其他的任一页面。小程序没有超链接能力,后期可能会有小程序页间的链接,从一个小程序页链接到另外一个小程序页。
- 运行的环境不同
以前的h5是在各个手机浏览器里运行,小程序只能在微信里运行
- 开发成本不同
- 传统h5开发需要很多工具完成的事,小程序开发工具帮我们做了,架构选型微信团队帮忙做了,框架维护。
- 学习小程序的开发就像学习react或vue框架一样,学习成本很低。
- 拥有的功能不同,
- 传统h5受限于手机浏览器,只能在浏览器的沙盒里运行,很多原生的能力是没有的,这也是大家众所周知的
,小程序可以通过微信干所有app能干的事情。
小程序的开发
- 获取appid
小程序公众平台里获取
- 创建项目,
是通过开发工具创建的 工具下载链接
- 编写代码
- app.js //业务逻辑文件
- app.json //配置文件
- app.wxss //样式文件 就是css文件
- app.wxml //视图文件 就是html
什么样的程序适合做成小程序的一些建议
- 小程序
- 正如其名,需是小程序,上限1M。
因为小程序都是从网上获取的,首次使用都要加载资源
- 简单的程序
- 不需要很复杂交互,对手机性能要求不高,不需要长时间使用的。比如酷跑这类游戏就不行了
- 初创公司或试水市场的程序
- 宣传方便,转发,贴二维码,因为用户不需要下载了,不会那么担心是个病毒软件了而不敢下载软件安装
- 他人的四象限解说
- 之前这个关于小程序的四象限图火了,他们认为不重要或不高频的程序应该做成小程序。我不这么认为,我认为除了像微信这么高频的程序但又不是很复杂的都可以做成小程序,因为微信已经把我们紧紧的粘起来了。
- 电商、生活类程序都应该做成小程序,当然有些公司为了战略考虑,可能不愿全身心投入到微信里面去做小程序
- 不适合做成小程序的游戏、视频。看看我们pc电脑上装了哪些程序,和哪些应用是浏览器打开的就知道哪些适合做成小程序哪些不适合小程序了。
- 最重要的一点是:没有严格限定哪些可以做,哪些不可以做。小程序官方也没有说哪些适合做成小程序哪些不适合做成小程序
unitTest——karma mocha webpack
unitTest
全局安装 karma mocha webpack
Build Setup
# install dependencies
npm install
# run unit tests
npm run unit
测试用例的编写
-
只需在test/specs目录下新建以'.spec.js'结尾的测试文件
-
需要的库直接用require引入(与html里的script标签引入的文件对应) 如:require('./../lib/zepto.min.js')
-
一个模块的编写格式,模块里面可以包含多个测试用例和多个模块
describe('Array', function() { describe('#indexOf()', function () { it('should return -1 when the value is not present', function () { expect([1,2,3].indexOf(5)).to.equal(-1); expect([1,2,3].indexOf(1)).to.equal(0); }); }); });
-
一个用例的编写 用例要写在模块里
it('...',function(){
...
})下面是一个完整的模块加用例
describe('#indexOf()', function () { it('should return -1 when the value is not present', function () { expect([1,2,3].indexOf(5)).to.equal(-1); expect([1,2,3].indexOf(1)).to.equal(0); }); });
单元测试的Hooks
describe('hooks', function() {
before(function() {
// runs before all tests in this block
//在这个模块里,所以用例开始跑之前执行一次且只一次before里的function
});
after(function() {
// runs after all tests in this block
//在这个模块里,所以用例开始跑完之后执行一次且只一次after里的function
});
beforeEach(function() {
// runs before each test in this block
//在这个模块里,每个用例开始跑之前都会执行一次beforeEach里的function
});
afterEach(function() {
// runs after each test in this block
//在这个模块里,每个用例开始跑完之后都会执行一次afterEach里的function
});
// test cases
it('...',funciton(){})
});
常用chaijs的expect断言语句
官网地址 http://chaijs.com/api/bdd/
expect(foo).to.not.equal('bar');//
expect({ foo: 'baz' }).to.have.property('foo').and.not.equal('bar');//
expect(foo).to.deep.equal({ bar: 'baz' });
expect(foo).to.have.any.keys('bar', 'baz');//any的使用
expect('test').to.be.a('string'); //a的使用
expect({ foo: 'bar' }).to.be.an('object');
expect(null).to.be.a('null');
expect(undefined).to.be.an('undefined');
expect(new Error).to.be.an('error');
expect(new Promise).to.be.a('promise');
expect(new Float32Array()).to.be.a('float32array');
expect(Symbol()).to.be.a('symbol');
expect('everything').to.be.ok;
expect(1).to.be.ok;
expect(false).to.not.be.ok;
expect(undefined).to.not.be.ok;
expect(null).to.not.be.ok;
expect(true).to.be.true;
expect(1).to.not.be.true;
expect(false).to.be.false;
expect(0).to.not.be.false;
expect(null).to.be.null;
expect(undefined).to.not.be.null;
expect(undefined).to.be.undefined;
expect(null).to.not.be.undefined;
对可测试行代码的编写的建议
- 单元测试追求分出更多的单元,方便测试和维护
- 方法有它的功能,有输入和输出
- 方法里的依赖的数据通过入参传入
- 对于vue组件的开发,业务关注的数据挂在组件对象vm上(我们开发是经常使用的this)
- 尽量少函数嵌套(方法分离出来方便单元测试)
一个真实的测试模块
index.vue文件对于的测试文件 index.spec.js
两个真实的测试模块 见附录代码1和附录代码2
vue相关测试官方地址
用到的与测试相关的模块及官方地址
测试开发经验
native依赖的数据入口
native callback函数的测试
-
针对mock数据的测试
模拟mtp能返回的所有可能的数据,如收银台支付接口的mtp数据返回 见附录代码3写测试用例时,每个用例要先存储mock数据数组的索引值 如收银台支付接口 WEBVIEW.add_db('unit_payOrderNew',6) 见附录代码4
-
有些程序是根据memory里的值来改变执行路径的,所以要跑测试用例之前要addMemory
-
native方法依赖的数据 比如pb_getBusinessParams方法 我们可以通过localStorage的方式存和取 先addMemory(),pc的native方法里
再getMemory 如附录代码5 -
native方法callback方法的单元测试
附录代码1
import Vue from 'vue'
import vuex from './../../../src/vuex';
import store from './../../../src/views/medicareCashier/cashierVuex'
require('./../lib/zepto.min.js')
require('./../lib/ctrl.min.js')
require('./../../../src/framework/index.js')
require('./../../../src/framework/common.js')
require('./../../../src/components/index.js')
describe('index.vue', () => {
var el;
var vm;
var index=require('./../../../src/views/medicareCashier/components/index.vue')
before(function() {
vm = new Vue(index).$mount();
})
it('引入index',()=>{
const vuem = new Vue({
template: '<div><index></index></div>',
components: {
index
}
}).$mount()
})
it('index.backbutton',()=>{
vm.$route={};
vm.backbutton()
vm.$route.name='index';
vm.backbutton()
})
})
附录代码2
import {
PayList
}
from './../../../../src/views/miniCashier/methods/PayList'; //使用payList
import {
Pay
} from './../../../../src/views/miniCashier/methods/PayProcess'
require('./../../../../../basePlugin/lib/zepto.min.js')
describe('PayProcess.js', () => {
var pay
var orderInfo,
paymentOption,
orderType;
before(() => {
orderInfo = {
"resultCode": "1000",
"resultMsg": "操作成功",
"sessionId": null,
"traceNo": "18118214",
"creditPayment": null,
"bankCardPayment": null,
"pointPayment": null,
"prepaidCardPayment": null,
"healthCardPayment": null,
"cmiLotteryPayment": null,
"cmiSalaryPayment": null,
"quotaPayment": null,
"busiGeneralPayment": null,
"unionBalancePaymentV2": {
"paymentId": "000001550B4C4D87|2DEF111AB0F1E7CD7AE6E3947574C4903F707A6957D71802",
"rawPaymentId": "1000010003016837",
"paymentType": "27",
"isChoose": "N",
"availAmount": 368322,
"availableBalance": 368322,
"minAmount": 0,
"maxAmount": 368322,
"balanceType": "27",
"switchOpen": true,
"whitoutCaMaxAmt": 0,
"withCaMaxAmt": 0,
"up2maxAvailableAmt": 0,
"upAccount": false
},
"couponPayment": {
"paymentId": "000001550B4C4D87|93250526013E2FCD",
"rawPaymentId": "126040",
"paymentType": "19",
"isChoose": "N",
"availAmount": 5000,
"minAmount": 0,
"maxAmount": 5000,
"couponSerialNo": "2614575245399245",
"couponAmount": 5000,
"couponType": "1",
"couponName": "直抵50元",
"couponPayType": "19",
"expiredDate": null,
"useFlag": false
},
"discountPayment": null,
"supportBankCardType": "A",
"targetName": "支万收银台联调测试商户",
"tradeAmount": 10000,
"commodity": null,
"tradeTime": null,
"transId": "I0060003201606010000000012479071"
}
paymentOption = {
"resultCode": "1000",
"resultMsg": "操作成功",
"sessionId": "c0f632adfd7a488bf58ebbc76fb50d8ee06aae51a6dae4f3034cb1d2758fc932",
"traceNo": "29113711",
"tradeAmount": 26365,
"unionBalancePaymentV2": {
"paymentId": "000001550B4C4D87|2DEF111AB0F1E7CD7AE6E3947574C4903F707A6957D71802",
"rawPaymentId": "1000010003016837",
"paymentType": "27",
"isChoose": "N",
"availAmount": 368322,
"availableBalance": 368322,
"minAmount": 0,
"maxAmount": 368322,
"balanceType": "27",
"switchOpen": true,
"whitoutCaMaxAmt": 0,
"withCaMaxAmt": 0,
"up2maxAvailableAmt": 0,
"upAccount": false
},
"transId": "I0060003201508100000000003262916"
}
WEBVIEW.addMemory('businessParams', {
"protocolInfo": {
"orderId": "1508170000299559"
},
"resultDisplayLevel": "S",
"couponUsed": 1,
"couponPayment": [{
"paymentId": "ID0000000000",
"paymentType": "ZD1111"
}],
"preInfo": {
"tradeAmount": "10000",
"prePayment": [{
"paymentId": "62206800000000",
"paymentType": "01",
"paymentAmount": "10000"
}]
}
})
paymentOption = checkPaymentOption(paymentOption)
orderType = '0'
pay = new Pay()
})
it('init', () => {
pay.init(orderInfo, paymentOption, orderType)
})
it('prePay', () => {
})
it('goPay', (done) => {
pay.goPay().then(function(result) {
expect(result).to.not.be.null
done()
}).catch(done)
})
it('payOrder 支付失败', (done) => {
WEBVIEW.add_db('unit_payOrderNew',5)
pay.payOrder({}).then(function(result) {
expect(result.status).to.be.equal('error')
// expect(result.status).to.be.equal('')
done()
}).catch(done)
})
//
it('payOrder——支付结果为成功 返回码1000', (done) => {
WEBVIEW.add_db('unit_payOrderNew',1)
pay.payOrder({}).then(function(result) {
expect(result.status).to.be.equal('success')
expect(result.resultCode).to.be.equal(3000)
done()
}).catch(done)
})
it('payOrder——支付结果为成功 返回码1000 查询轮训状态', (done) => {
WEBVIEW.add_db('unit_payOrderNew',2)
pay.payOrder({}).then(function(result) {
expect(result.status).to.be.equal('waiting')
expect(result.resultCode).to.be.equal(3000)
done()
}).catch(done)
})
//7 [1032, 1101, 1037, 1027, 1035] 失败提示
it('payOrder——[1032, 1101, 1037, 1027, 1035] 失败提示', (done) => {
WEBVIEW.add_db('unit_payOrderNew',6)
pay.payOrder({}).then(function(result) {
expect(result.status).to.be.equal('err')
expect(result.resultCode).to.be.equal(3010)
done()
}).catch(done)
})
it('payOrder——邮储直连', (done) => {
WEBVIEW.add_db('unit_payOrderNew',3)
pay.payOrder({}).then(function(result) {
expect(result.resultCode).to.be.equal(2000)
expect(result.router.name).to.be.equal('bankSMS')
done()
}).catch(done)
})
// it('payOrder——邮储直连 缺失参数 paymentTransId', (done) => {
// WEBVIEW.add_db('unit_payOrderNew',7)
// pay.payOrder({}).then(function(result) {
// expect(result.status).to.be.equal('paramsErr')
// expect(result.resultCode).to.be.equal(3010)
// done()
// }).catch(done)
// })
it('payOrder——邮储直连 缺失参数 paymentTransId', (done) => {
WEBVIEW.add_db('unit_payOrderNew',7)
pay.payOrder({}).then(function(result) {
expect(result.status).to.be.equal('paramsErr')
expect(result.resultCode).to.be.equal(3010)
done()
}).catch(done)
})
it('payOrder——订单付款人信息不一致 1250', (done) => {
WEBVIEW.add_db('unit_payOrderNew',8)
pay.payOrder({}).then(function(result) {
// expect(result.status).to.be.equal('paramsErr')
// expect(result.resultCode).to.be.equal(3010)
done()
}).catch(done)
})
it('payOrder——订单付款人信息不一致 1250', (done) => {
WEBVIEW.add_db('unit_payOrderNew',9)
pay.payOrder({}).then(function(result) {
// expect(result.status).to.be.equal('paramsErr')
// expect(result.resultCode).to.be.equal(3010)
done()
}).catch(done)
})
it('payOrder——账户被锁 去设置支付密码 1014', (done) => {
WEBVIEW.add_db('unit_payOrderNew',10)
pay.payOrder({}).then(function(result) {
expect(result.status).to.be.equal('reset')
expect(result.resultCode).to.be.equal(3010)
done()
}).catch(done)
})
it('payOrder——账户被锁 去设置支付密码 1014 paytype=2 前置直接退出', (done) => {
WEBVIEW.add_db('unit_payOrderNew',10)
pay.payType=2;
pay.payOrder({}).then(function(result) {
expect(result.status).to.be.equal('reset')
expect(result.resultCode).to.be.equal(3010)
done()
}).catch(done)
})
// 三种订单类型 orderType 1,2,0
it('payOrder 支付失败', (done) => {
WEBVIEW.add_db('unit_payOrderNew',5)
pay.payType=1
pay.payOrder({}).then(function(result) {
expect(result.status).to.be.equal('error')
// expect(result.status).to.be.equal('')
done()
}).catch(done)
})
it('payOrder 支付失败', (done) => {
WEBVIEW.add_db('unit_payOrderNew',5)
pay.payType=2
pay.payOrder({}).then(function(result) {
expect(result.status).to.be.equal('error')
// expect(result.status).to.be.equal('')
done()
}).catch(done)
})
})
function checkPaymentOption(paymentOption) {
if (!paymentOption || paymentOption.resultCode != '1000') {
exit("获取支付方式失败!");
return false;
}
var paymethod = { //重新定义支付信息内容
defaultPayment: [], //支付方式
couponMethod: [] //优惠信息
};
window.PAYMETHODSKEYS = ['quotaPayment', 'unionBalancePaymentV2',
'bankCardPsayment', 'prepaidCardPayment', 'zqbPayment',
'pointPayment', 'flbPayment', 'healthCardPayment'
];
window.COUPONMETHODS = ['discountPayment', 'couponPayment'];
var payMethodsKeys = window.PAYMETHODSKEYS; //8类支付方式
var couponMethods = window.COUPONMETHODS; //两种优惠
//获取可用支付方式,只有一个可用了,取到则直接退出循环,如果没取到,跳转绑卡
var payList = new PayList();
$.each(payMethodsKeys, function(index, item) {
if ($.isArray(paymentOption[item])) { //判断是否数组
if (paymentOption[item].length == 0) {
return;
} else {
var tempList = paymentOption[item];
}
} else {
if (!paymentOption[item] || Object.keys(paymentOption[item]).length == 0) {
return;
} else {
var tempList = [paymentOption[item]];
}
}
var temp = payList.transPayment(tempList[0]);
paymethod['defaultPayment'] = [temp];
return false;
});
if (paymethod.defaultPayment.length == 0) { //无支付方式,跳转绑卡
openPublicPlugin({
business: {
dest: "B"
},
callBack: APPSTART
});
return false;
}
$.each(couponMethods, function(index, item) { //获取优惠信息
if ($.isArray(paymentOption[item])) { //判断是否数组
if (paymentOption[item].length == 0) {
return;
} else {
var couponList = paymentOption[item];
}
} else {
if (!paymentOption[item] || Object.keys(paymentOption[item]).length == 0) {
return;
} else {
var couponList = [paymentOption[item]];
}
}
var temp = couponList[0];
temp.avail = 0;
if (temp.paymentType == '15') {
temp.avail = temp.discountAmount;
} else if ($.inArray(temp.paymentType, ['19', '20']) > -1) {
temp.avail = temp.couponAmount;
}
paymethod['couponMethod'].push(temp);
});
return paymethod; //支付信息存储到memory
}
附录代码3
var payOrderData = [{ //邮储直连
"extraPoint": 0,
"extraPointFlag": false,
"passRiskValidation": true,
"payToken": "104113972",
"paymentTransId": "0001116668886523486",
"resultCode": "1221",
"resultMsg": "支付需要银行验证短信",
"sessionId": "mtp-cedf9c78-8189-4c34-b6b5-1a07dc610046",
"traceNo": "19946332",
"tradeId": "I0060003201602180000000014913529",
"unkownPayStatus": false
}, {//1
"resultCode": "1000",
"resultMsg": "操作成功",
"sessionId": "942fb991-6fd5-480a-bb12-adb4db33657f541154669",
"traceNo": "12860482",
"tradeId": "00030003201404290000000004272369",
"unkownPayStatus": false,
"extraPointFlag": true,
"extraPoint": 0
},{//2
"resultCode": "1000",
"resultMsg": "操作成功",
"sessionId": "942fb991-6fd5-480a-bb12-adb4db33657f541154669",
"traceNo": "12860482",
"tradeId": "00030003201404290000000004272369",
"unkownPayStatus": true,
"extraPointFlag": true,
"extraPoint": 0
}, {//3 邮储直链
"resultCode": "1221",
"resultMsg": "操作成功",
"sessionId": "942fb991-6fd5-480a-bb12-adb4db33657f541154669",
"traceNo": "12860482",
"tradeId": "00030003201404290000000004272369",
'paymentTransId': '1231123',
"unkownPayStatus": false,
"extraPointFlag": true,
"extraPoint": 0
}, {//4
"resultCode": "1000",
"resultMsg": "操作成功",
"sessionId": "942fb991-6fd5-480a-bb12-adb4db33657f541154669",
"traceNo": "12860482",
"tradeId": "00030003201404290000000004272369",
"unkownPayStatus": true,
"extraPointFlag": true,
"extraPoint": 0
}, {//5
"resultCode": "1022",
"resultMsg": "余额不足",
"sessionId": "20993f4b-1271-45c3-9f4b-",
"traceNo": null
},{//6 [1032, 1101, 1037, 1027, 1035] 失败提示
"resultCode": "1037",
"resultMsg": "密码错误",
"sessionId": "942fb991-6fd5-480a-bb12-adb4db33657f541154669",
"traceNo": "12860482",
"tradeId": "00030003201404290000000004272369",
'paymentTransId': '123',
"unkownPayStatus": false,
"extraPointFlag": true,
"extraPoint": 0
},{//7 邮储直链 缺失参数paymentTransId
"resultCode": "1221",
"resultMsg": "操作成功",
"sessionId": "942fb991-6fd5-480a-bb12-adb4db33657f541154669",
"traceNo": "12860482",
"tradeId": "00030003201404290000000004272369",
'paymentTransId': '',
"unkownPayStatus": false,
"extraPointFlag": true,
"extraPoint": 0
},{//8 邮储直链 缺失参数paymentTransId
"resultCode": "1250",
"resultMsg": "操作成功",
"sessionId": "942fb991-6fd5-480a-bb12-adb4db33657f541154669",
"traceNo": "12860482",
"tradeId": "00030003201404290000000004272369",
'paymentTransId': '',
"unkownPayStatus": false,
"extraPointFlag": true,
"extraPoint": 0
},{//9 邮储直链 缺失参数paymentTransId
"resultCode": "-1001",
"resultMsg": "操作成功",
"sessionId": "942fb991-6fd5-480a-bb12-adb4db33657f541154669",
"traceNo": "12860482",
"payToken": "104113972",
"tradeId": "00030003201404290000000004272369",
'paymentTransId': '',
"unkownPayStatus": false,
"extraPointFlag": true,
"extraPoint": 0
},{//10 邮储直链 缺失参数paymentTransId
"resultCode": "1014",
"resultMsg": "操作成功",
"sessionId": "942fb991-6fd5-480a-bb12-adb4db33657f541154669",
"traceNo": "12860482",
"payToken": "104113972",
"tradeId": "00030003201404290000000004272369",
'paymentTransId': '',
"unkownPayStatus": false,
"extraPointFlag": true,
"extraPoint": 0
}];
var db_index=WEBVIEW.get_db('unit_payOrderNew')
if(db_index){
WEBVIEW.remove_db('unit_payOrderNew')
return payOrderData[db_index]
}
return payOrderData[0];
附录代码4
//7 [1032, 1101, 1037, 1027, 1035] 失败提示
it('payOrder——[1032, 1101, 1037, 1027, 1035] 失败提示', (done) => {
WEBVIEW.add_db('unit_payOrderNew',6)
pay.payOrder({}).then(function(result) {
expect(result.status).to.be.equal('err')
expect(result.resultCode).to.be.equal(3010)
done()
}).catch(done)
})
附录代码5
WEBVIEW.addMemory('businessParams', {
"protocolInfo": {
"orderId": "1508170000299559"
},
"resultDisplayLevel": "S",
"couponUsed": 1,
"couponPayment": [{
"paymentId": "ID0000000000",
"paymentType": "ZD1111"
}],
"preInfo": {
"tradeAmount": "10000",
"prePayment": [{
"paymentId": "62206800000000",
"paymentType": "01",
"paymentAmount": "10000"
}]
}
})
[PB_GETBUSINESSPARAMS](pluginId) {
//插件业务数据
var a = {
"ss": "123456",
protocolInfo: {
"orderId": "8734829092-090294092",
"protocolNo": "87286242787237923"
},
payToolList: [{
payToolId: 'alipay',
logoId: 'zfb_pay',
name: '支付宝',
discountDesc: 'kajdsk',
payToolDesc: '',
priority: '1'
}, {
payToolId: 'weipay',
logoId: 'wxzf_pay',
name: '微信支付',
discountDesc: '测试测试',
payToolDesc: '使用微信支付',
priority: '2'
}],
otherBanks: {
credit: [],
debit: ["ICBC", "ABC", "CCB"]
},
bankCardType: 'A',
final: "A",
locationNo: '深圳',
realName: '张*大',
idCardNo: '3206************79',
dest: "B",
phoneNum: '18217065902'
};
var pb_getBusinessParams=WEBVIEW.getMemory('pb_getBusinessParams')
if(pb_getBusinessParams){
a= pb_getBusinessParams;
}
return JSON.stringify(a);
}
sublime常用插件
- vue-syntax-highlight
http://www.jianshu.com/p/edbc2a13494b
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.