微信支付的那些事儿

前言

最近公司产品在做微信支付接入,有幸接触到微信支付开发这一块儿的任务,在整个支付接入过程中积累了一些经验(日常爬坑),就此和小伙伴们分享一下!(主要是前端)

流程

业务流程:
微信在支付页面输入金额,点击支付按钮,后台处理处理数据并获取到预支付ID(prepay_id),返回到前端的页面上。页面上通过js_sdk唤起微信支付的页面,弹出输入密码页面,用户输入密码后,由微信展示支付成功页面(微信自己实现),跳转到我们自己定义的页面,展示支付结果。

开发流程:

  1. 获取用户授权
    在生成预支付id的过程中需要获取用户授权,并且拿到用户的openid。可以直接参考官方文档:
    https://open.weixin.qq.com/cgibin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN

  2. 引入JSSDK
    在需要调用微信支付功能的页面引入的jssdk,直接放在HTML的head里面。
    <script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

  3. H5唤起微信支付功能

  4. 使用微信jssdk中的wx.config配置方法注册支付功能

wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: json.appid._cdata, // 必填,公众号的唯一标识
timestamp: timestamp, // 必填,生成签名的时间戳
nonceStr: json.nonce_str._cdata, // 必填,生成签名的随机串
signature: Sign(arr1, 'SHA1'),// 必填,调用js签名,
jsApiList: ['chooseWXPay'] // 必填,需要使用的JS接口列表,这里只写支付的
});

  1. 在使用wx.choosePay唤起支付

wx.chooseWXPay({
timestamp: timestamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
nonceStr: json.nonce_str._cdata, // 支付签名随机串,不长于 32 位
package: "prepay_id=" + json.prepay_id._cdata, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
signType: "MD5", // 签名方式,默认为´SHA1´,使用新版支付需传入´MD5´
paySign: Sign(arr2, 'MD5'), // 支付签名
success: function (res) {
},
cancel: function (res) {
//alert(´取消支付´);
}
});

3.支付成功后,处理回调URL

官方解释:
支付完成后,微信会把相关支付和用户信息发送到商户设定的通知URL,验证签名,并回应微信。对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略(如30分钟共8次)定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。

主要是3步:

  1. 解析传过来的流信息,通过重新签名的方式验证流中包含的信息的正确性。就是判断这个信息到底是不是微信发的。
  2. return_code和result_code都是SUCCESS的话,处理商户自己的业务逻辑。就是订单的支付状态啊等一些信息。
  3. 告诉微信,我收到你的返回值了。不用在发了。

注意事项

  1. 获取预支付id的时候如果前后端是分离的,那么一定要都统一使用MD5签名,因为在生成预支付ID的时候可以使用MD5或者HMACSHA256,但是但是但是,新版支付中,在前端唤起支付的时候的签名只能使用MD5签名,当后台使用HMACSHA256的时候就会提示验签出错,如果你和后台人员没有事先商量过,那你很可能调试很久都不会发现这个问题。

  2. 因为微信获取授权,拿到(openid),是通过URL重定向拿到的,所以当你重定向到当前页面会造成页面的不断刷新,这个时候你需要判断用户是否是第一次进入这个页面,如果是重定向到当前页面,就不要再跳转了。我们使用的方法是利用cookie来做判断。

if(document.cookie.indexOf("a=one")==-1){
let t=new Date(new Date().getTime()+1000*5);
document.cookie="a=one; expires="+t.toUTCString();
window.location.href='//获取用户授权,拿到openid的链接'
}else{
let t=new Date(new Date().getTime()+1000);
document.cookie="a=two; expires="+t.toUTCString();
}

  1. 关于签名,利用jssdk唤起微信支付功能需要有两次签名,算上后端获取预支付ID的过程中也有一次签名,这就是3次签名。第一次签名是在wx.config中的signature,此处使用的是SHA1签名,生成预支付ID的sign和唤起支付功能的paySign使用的是MD5签名。在wx.choosePay中的签名的参数也有值得注意的一些地方,主要是参数的大小写。

signature中参与签名的字段
const arr1 = [
'noncestr='+ json.nonce_str._cdata,
'jsapi_ticket='+ json.wx_jsapi_ticket._cdata,
'timestamp='+ timestamp,
'url=授权目录 '
]

paySign中参数签名的字段
const arr2 = [
'nonceStr='+json.nonce_str._cdata,
'package=prepay_id='+json.prepay_id._cdata,
'signType=MD5',
'appId='+json.appid._cdata,
'timeStamp='+timestamp
]

结语

微信支付的接入过程中,最具参考价值的就是官方文档,一定要先对文档的内容有一个清晰的了解(就因为微信的文档会让人非常的抓毛,才会需要更加仔细的了解),还有在前后端一起开发的过程中,一定要多沟通,就如同上面的签名方式一样,如果没有事先商量,唤起支付的时候就很容易失败,然后自己的参数又是完全正确的,简直无从下手!团队开发一定要学会团队合作,这样才能事半功倍,不然只是徒增麻烦!

【海说软件接受各种技术咨询及开发业务】

END

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272

推荐阅读更多精彩内容