JS交互微信之JSAPI支付

新手学堂014

JS交互微信之JSAPI支付,第1张

本篇为 JS交互微信系列篇 的第四篇 微信JSAPI支付 ,记录在微信内置浏览器内用调用微信支付过程。

JSAPI支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。

要拥有两个账号:

要开通产品中心的JSAPI支付。然后 产品中心=>开发配置=>支付配置=>公众号支付配置 绑定支付授权目录,写已通过ICP备案的域名。

另外,要在ip白名单中,配置测试地址ip和线上生产地址ip,不然各种回调都会失败!

由于在微信内支付需要获取用户的 openid ,要获取它则必须通过网页授权配置。在公微信公众平台中, 公众号设置=>功能设置=>网页授权域名 中按要求填写。

在支付流程方面,重点依然都在后端处理,前端方面步骤比较简单。本文只叙述前端内容。

在将要进入支付的前一页面,直接接入微信授权,然后跳转进要支付的那个页面。举个例子:有a、b两个页面,在b页面用到支付,b页面由a页面跳转而来。那么在a页面跳b页面的时候,别直接跳转b的url,而是跳转到:

https://openweixinqqcom/connect/oauth2/authorizeappid={appId}&redirect_uri={bhtml}&response_type=code&scope=snsapi_base#wechat_redirect

我们注意到,这里有这两个需要自己写的参数: appid 和 redirect_uri ,意义是:

另外,还有一个注意的点是, bhtml这个url我们要进行encode转码,不然地址解析可能会出现问题!

上一步执行完后,在微信浏览器中,我们会得到一个链接,类似:

bhtml&code={code}&state=#/

在此处,我们得到了一个code值,这就是我们获取 openid 的凭证了。

获取方法当然是把值传给后台,后台去处理啦~

在上一步中,我们拿到code值后,就可以提交一些信息给后端了,比如商品相关属性、总价等,另外加上code值,传给后端。后端一顿操作后,返回给前端。我们需要的参数如下(后端返回下面这些参数):

上个步骤拿到需要交互微信的参数后,就开始调用微信的支付接口了,如下:

至此,调用微信JSAPI来完成在微信内的支付就完成了。

一、企业申请支付宝

1、申请支付宝需要的资料:需要一个邮箱,作为支付登录名、网站域名、联系人和手机号码、营业执照影印件、对公银行账户,可以是基本户或一般户、法定代表人的身份证影印件。

2、申请条件:

(1)必须有已建设完成的无线网站(不包含淘宝网店、团购类网站);网站必须已通过ICP备案,备案信息与签约商户信息一致,网站经营的商品或服务内容明确、完整(古玩、珠宝等奢侈品、投资类行业无法申请本产品);

(2)申请前必须拥有企业支付宝账号(不含个体工商户账号),且通过支付宝实名认证审核,公司实收资本≥10万元。

二、企业申请微信

1、企业申请微信支付时需准备以下资料: 微信支付负责人姓名丶联系电话丶邮箱、营业执照、组织机构代码证、税务登记证、商家名称、公司地址及邮政编码、营业执照持有人类型、姓名、所持证件及扫描件。

2、微信支付申请流程:企业将以上资料准备好后,联系美基营销在线工作人员,美基营销将在2小时内初步审核企业资料。之后需要客户配合完善相关手续,如盖章签字丶快递资料丶拍照等,最终美基营销技术人员开发并上线微信支付接口。企业开通微信支付所需时间为4~9工作日,一般个体户所需时间为7~15工作日。

扩展资料

支付接口

2014年3月4日晚,腾讯宣布微信支付接口结束内测,将向所有通过认证的服务号开放。具体信息包括:

1微信公布微信支付申请流程:

(1)首先需要申请成为服务号,并在申请微信认证后;

(2)填写商户基本资料、业务基本资料、财务审核资料。

(3)通过审核进入开发流程,通过开发接口文档的指引,完成开发。

(4)开发完成后,即开通微信支付能力。

2014年09月13日,为了给更多的用户提供微信支付电商平台,微信服务号申请微信支付功能将不再收取2万元保证金,开店门槛将降低。

保证金的取消无疑是对微信支付门槛的大大降低。未来一段时间内或将有大批商户开始申请接入微信支付,2014年7月底微信官方公布微信公众账号超过580万,每天新增15万,据业内人士分析,这一数据年底有望破1000万,将超过淘宝800万的卖家数目。微信降低支付门槛,更多的淘宝卖家和新型创业者将会大量涌微信公众平台,势必会迎来更多的企业用户注册。

参考资料 微信支付

内嵌网页中可使用JSSDK 130提供的接口,可坑就来了,居然不支持支付接口的调用,经过一番研究,总算打通了两边的交互。

大概流程

1、先说明涉及到的文件,下面会用到

11 appjs:小程序的appjs文件,在globalData里定义一个全局变量paySuccessUrl: '',用来保存支付成功跳转url

12 wxminiwebviewjs:小程序中放web-view的界面 13 wxminipayjs:小程序原生支付界面

14 web_payvue:内嵌网页会调起支付的路由组件界面,由于我是用vue+vue-router写的,所以你最好了解下vue和vue-router,记得引入微信jssdk130,最新版本才包含小程序相对应方法。很遗憾,微信并没提供npm包,github有人提供的commonjs引入方式的微信jssdk版本也只有120,所以就只能这样引入了。

<script src="/static/jweixin-130js">script>

2、首先我们像官网那样正常嵌入一个内嵌网页,url是wxmini_webviewjs中data中定义的变量,webview加载的就是网页就是这个url。

<web-view src="{{url}}">web-view>

3、在内嵌网页web_payvue里判断当前是否是微信环境。

windowwxready(function () {

isWxMini = window__wxjs_environment === 'miniprogram'

})

4、在内嵌网页web_payvue调用支付时把支付金额,支付说明,支付成功跳转url(任何你想要的参数,记得encodeURIComponent),传给小程序原生页面。

if (isWxMini) {

let jumpUrl = encodeURIComponent(windowlocation)

let path = `/page/pay/payamount=${amount}&title=${desc}&jumpUrl=${jumpUrl}`

windowwxminiProgramnavigateTo({

url: path

})

}

5、在小程序支付界面wxmini_payjs里获取到内嵌网页传过来的值,这里演示方便,实际上是在page的data里存储这些会显示在界面的值好些。

onLoad: function (options) {

consolelog(options)

// 获取网页传过来的值

// TODO 用es6解构来获取值TODO

jumpUrl = optionsjumpUrl

amount = optionsamount

title = optionstitle

},

6、支付成功后,把跳转url附带支付结果及当前时间保存到全局变量。

paySuccess () {

let currentTime = new Date()getTime()

//这是为了防止wxmini_webviewjs文件里调用setData由于前后两个url一致导致路由不触发刷新的bug

jumpUrl = optionsjumpUrl+encodeURIComponent(`payResult=1&time=${currentTime}`)

//payResult=1表示支付成功,这里我偷懒了直接在url后面补,实际情况比较复杂

//为了实现支付成功返回后的无刷新加载,这里的参数应该是属于路由web_payvue的,而不是属于windowlocationsearch的

//所以要判断路由锚点#的位置和是否已经有路由参数(如果是vue-router的history模式我没用过,应该和windowlocation一样吧)

getApp()globalDatapaySuccessUrl=jumpUrl //保存跳转url到小程序全局变量里

wxnavigateBack() //返回会上个页面,也就是承载网页的容器页面wxmini_payjs

}

7、回到小程序wxmini_webviewjs,会触发onshow,在里面进行界面无刷新加载。

onShow: function () {

consolelog('on show')

let paySuccessUrl = getApp()globalDatapaySuccessUrl

getApp()globalDatapaySuccessUrl="" //清空支付成功url,防止一些操作触发onShow事件

if (paySuccessUrl) {

let url = decodeURIComponent(paySuccessUrl)

thissetData({

//这里在次说明下步骤6中的&time=${currentTime},就是因为不加这个当你第一次支付成功回来这里

//这个url跟你第二次支付成功回来这里是一样的,会导致第二次支付开始,这里的setData方法失效

url

})

}

},

8、步骤7中的setData会触发webview中的网页加载,由于我采用的是vue-router,而且前后两个url只有路由的参数query不一样,所以并不会触发界面刷新,也不会触发路由的重新加载,而是只会触发beforeRouteUpdate 这个方法,举个例子,现在支付前界面是https://host/#/pay,然后支付成功后跳转https://host/payResult=1&time=123456#/pay,此时界面不会刷新,pay路由也不会重新加载,而是触发beforeRouteUpdate (to, from, next),你要做的只是在这里界面解析toquery里的数据,然后该干嘛干嘛

beforeRouteUpdate (to, from, next) {

consolelog('路由发生改变,很有可能是小程序的支付成功回调')

let payResult = toquerypayResult

if (payResult) { // 小程序支付成功

if (payResult === '1') {

consolelog('支付成功,下班打卡走人')

}

}

next()

},

demo中提供的js是无法访问到真实的支付界面的。因为demo中只是用来演示的,微信的支付接口是部署在内网的,外网是无法访问的。

(1)用户打开商户网页选购商品,发起支付,在网页通过JavaScript调用getBrandWCPayRequest接口,发起微信支付请求,用户进入支付流程。

(2)用户成功支付点击完成按钮后,商户的前端会收到JavaScript的返回值。商户可直接跳转到支付成功的静态页面进行展示。

(3)商户后台收到来自微信开放平台的支付成功回调通知,标志该笔订单支付成功。