文档章节

一个二维码支持支付宝和微信支付(上)

Skqing
 Skqing
发布于 2016/09/08 08:55
字数 996
阅读 11777
收藏 32

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

    一个二维码同时支持微信和支付宝扫描的原理很简单,就是中间做了一个跳转,判断用户用的是什么浏览器请求的即可。

    这里首先要说清楚的是支付宝的支付是蛮简单的,我们使用的是“手机网站支付”的方式,这种方式如果手机上安装了支付宝就会调用支付宝APP进行支付,否则是H5支付;微信支付就复杂一点了,我们用微信H5支付必须用“公众号支付”支付方式,这种方式支持H5调起支付API打开微信客户端进行支付。

    对于微信公众号支付,使用到的参数应该是申请了微信公众号支付之后微信发给申请人邮件里面的参数,刚开始的时候也是被这些参数给搞晕了

appid:应用ID,大部分情况都要用到。

mch_id:商户号,下单的时候使用。

AppSecret:应用密钥,获取用户openId时用到。

sign_key:签名密钥,下单和支付的时候用于加密参数。

 

以下是简单的代码流程:

二维码生成地址

调用此方法生成一个二维码,用户用微信或者支付宝扫描二维码进入到下面这个方法:

这个方法的关键就是判断用户用的是什么扫描的,这个可以通过User-Agent来判断,然后在这个方法里面就可以创建订单目的是把订单编号传递给第三方支付渠道。

对于微信支付,在调用统一下单接口来创建订单的时候是,如果trade_type用的是 "JSAPI"就必须传递一个用户的openId:

因此在choosePayWay这个方法里面,如果用户是用微信扫描的,我们要返回一个用于获取用户openId的链接地址的回调地址,注意是回调地址:

choosePayWay.do

choosePayWay.jsp

这样用户点击微信支付会跳转到authorize,然后微信会回调到我们提供的回调方法userOauthAndPayOrder.do

在这个方法里面我们用拿到的code换取用户的openId

拿到用户openId我们就可以调用统一下单接口下单了:

如果下单成功,我们会拿到一个微信的订单号,然后就可以跳转到微信支付页面,同时调起微信APP进行支付了:

微信支付界面payByWeixin.jsp

只要进到这页面就会调起微信APP进行支付了。

效果图:

 

接下来我们说支付的支付,支付宝支付相对简单的不能再简单了,我们在choosePayWay.jsp里面添加一个连接:

点击此链接进入到payByAlipay.do,这个方法里面我们调用支付宝的“手机网站支付”接口,生成订单并发起支付,这个过程只需要一个步骤,而微信却需要两个步骤(微信是先下单,再支付),以下是调用调用支付宝支付代码:

关键点在于app_pay这个参数,如果填“Y”,则会检测是否安装支付宝APP,如果安装则打开APP支付。

效果图:

注意:

1.支付宝使用的是老的WAP支付接口

2.如果微信支付接口签名校验工具校验你提交到微信统一下单接口的XML是正确的,但你请求之后返回“签名错误”那可能是你的KEY写错了,应该是商户平台里面的KEY而不是公众号后台的KEY。

此技能大家是否有get到呢?

© 著作权归作者所有

Skqing

Skqing

粉丝 40
博文 207
码字总数 26845
作品 0
深圳
后端工程师
私信 提问
加载中

评论(10)

Skqing
Skqing 博主

引用来自“zb1480811420598”的评论

问下博主:微信的支付最后调起的是微信公众号支付吧,我指定的redirect_url是一个页面,我指定控制器的话会显示参数错误,还有一个很关键的问题就是我每次在微信回调我的页面之前都需要让用户去授权登录,请问你也是这样吗?

回复@zb1480811420598 : 是需要用户授权的,不过第一次授权之后好像就不用了
z
zb1480811420598
问下博主:微信的支付最后调起的是微信公众号支付吧,我指定的redirect_url是一个页面,我指定控制器的话会显示参数错误,还有一个很关键的问题就是我每次在微信回调我的页面之前都需要让用户去授权登录,请问你也是这样吗?
Skqing
Skqing 博主

引用来自“花伦同学KO”的评论


我的哥可以给个QQ吗,最近在做和你们这个一模一样的功能,好多问题想问,刚入行,求关照。
569141948
花伦同学KO

我的哥可以给个QQ吗,最近在做和你们这个一模一样的功能,好多问题想问,刚入行,求关照。
Skqing
Skqing 博主

引用来自“WayneYoung”的评论

大神,刚才那个问题我已经解决了。但现在支付宝给我返回illegal_partner的错误码。我现在用的是沙箱测试账号。要解决这种情况是需要用正式的企业账号,还是需要在沙箱测试账号里做一些设置?
我没用沙箱测试,那个好麻烦,我是直接用的正式帐号测试的!
W
WayneYoung
大神,刚才那个问题我已经解决了。但现在支付宝给我返回illegal_partner的错误码。我现在用的是沙箱测试账号。要解决这种情况是需要用正式的企业账号,还是需要在沙箱测试账号里做一些设置?
Skqing
Skqing 博主

引用来自“WayneYoung”的评论

大神,我按照你的实例传入这些参数,但返回了
404 Not Found

The requested URL was not found on this server. Sorry for the inconvenience.
Please report this message and include the following information to us.
Thank you very much!

URL:  http://openapi.alipay.com/gateway.do_input_charset=utf-8?body=%E4%B8%80%E7%A7%8D%E5%BE%88%E9%BA%BB%E7%9A%84%E6%8A%84%E6%89%8B&subject=%E9%87%8D%E5%BA%86%E8%80%81%E9%BA%BB%E6%8A%84%E6%89%8B&sign_type=MD5¬ify_url=http%3A%2F%2F15342c75f7.imwork.net%3A35816%2FzfbPay%2Fnotify_url.jsp&out_trade_no=70501111111S001111119&return_url=http%3A%2F%2F15342c75f7.imwork.net%3A35816%2FzfbPay%2Freturn_url.jsp&sign=62d3ae042739b3975c912fa45eae9148×tamp=2016-09-23+11%3A14%3A25.028&app_pay=Y&_input_charset=utf-8&total_fee=1&service=create_direct_pay_by_user&seller_id=2088502581029255&app_id=2016083101826656&partner=2088102172344327&payment_type=1
Server:  openapi-60-78
Date:  2016/09/23 11:14:20

大神,我的问题出在了哪里呢?
是不是你的网关地址写错了?
W
WayneYoung
大神,我按照你的实例传入这些参数,但返回了
404 Not Found

The requested URL was not found on this server. Sorry for the inconvenience.
Please report this message and include the following information to us.
Thank you very much!

URL:  http://openapi.alipay.com/gateway.do_input_charset=utf-8?body=%E4%B8%80%E7%A7%8D%E5%BE%88%E9%BA%BB%E7%9A%84%E6%8A%84%E6%89%8B&subject=%E9%87%8D%E5%BA%86%E8%80%81%E9%BA%BB%E6%8A%84%E6%89%8B&sign_type=MD5¬ify_url=http%3A%2F%2F15342c75f7.imwork.net%3A35816%2FzfbPay%2Fnotify_url.jsp&out_trade_no=70501111111S001111119&return_url=http%3A%2F%2F15342c75f7.imwork.net%3A35816%2FzfbPay%2Freturn_url.jsp&sign=62d3ae042739b3975c912fa45eae9148×tamp=2016-09-23+11%3A14%3A25.028&app_pay=Y&_input_charset=utf-8&total_fee=1&service=create_direct_pay_by_user&seller_id=2088502581029255&app_id=2016083101826656&partner=2088102172344327&payment_type=1
Server:  openapi-60-78
Date:  2016/09/23 11:14:20

大神,我的问题出在了哪里呢?
Skqing
Skqing 博主

引用来自“WayneYoung”的评论

大神,没有get到啊!!!能说的再详细点吗?
很详细了啊,哪里不懂?
W
WayneYoung
大神,没有get到啊!!!能说的再详细点吗?
微信和支付宝支付模式详解及实现二

  继上篇《微信和支付宝支付模式详解及实现》到现在已经有半年时间了,这期间不少朋友在公号留言支付相关的问题,最近正好也在处理公司支付相关的对接,打算写这篇来做一个更进一步的介绍,...

KevinWG
2017/10/29
1K
2
基于 JFinal 的微信公众号极速开发 SDK - weixin_guide

weixinguide 是基于 JFinal 的微信公众号极速开发 SDK,只需浏览 Demo 代码即可进行极速开发,自 JFinal Weixin 1.2 版本开始已添加对多公众号支持。 10分钟搭建属于自己的ngork服务器,实现...

Javen-IJPay
2017/04/28
5.8K
5
免sdk实现微信/支付宝转账打赏功能

安卓开发者都应该有一个属于自己的APP发布到市场,可以完善自己的技术站之外,加入广告,还可以有一份小收入。 但是这个年代,各家的应用市场是不欢迎带广告sdk的个人开发者应用的。还好我们...

常兴E站
2017/09/21
0
0
用selenium webdriver写自动化测试脚本,遇到支付宝和财付通的密码输入框!

最近在写一个购物流程的自动化脚本,但是写到支付环节发现没办法使用脚本输入密码了,因为财付通和支付宝的支付页面密码框都获取不到,即便获取到了也不能输入,在网上找了一圈,用JNA实现了...

迷途小测试
2016/06/02
3.7K
5
JFinal/jfinal-weixin-demo

Javen 微信公众号极速开发 weixinguide 是基于jfinalweixin SDK开发的实战项目。 博客 简易的微信公众号管理平台 10分钟搭建属于自己的ngork服务器,实现内网穿透 Android 微信、支付App支付...

JFinal
2014/12/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

dynamic-connectivity 动态连通性问题之 quick-union 算法

quick-union 的思想是:若对象 p 的 root_id 和对象 q 的 root_id 相等,则认为 p 和 q 连通。 若要将对象 p 和对象 q 连通(已知两对象未连通),则将 p 的 root_id 的值设为 q 的 root_id ...

Phpythoner_Alei
今天
40
0
OSChina 周六乱弹 —— 实在选不出来就唱国歌

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @花间小酌 :#今日歌曲推荐# 分享阿冗的单曲《你的答案》。--祝大家在2020年都找到自己答案。 《你的答案》- 阿冗 手机党少年们想听歌,请使劲...

小小编辑
今天
27
1
Maven打包可执行Jar包的方法

在使用Java开发中,会使用到将工程打包成可执行的jar包的情况,那么在maven中怎么将项目中的依赖包都添加到jar中呢。在pom.xml中添加一下插件: <build><plugins><plugin><ar...

CapJes
今天
13
0
使用vue 开发地图类系统(openlayers.js)的注意。

使用vue 开发地图类系统的注意。 1、使用地图应该创建的对象 少使用 vue 的data 和计算属性(comments)存数据或是vuex。 为什么要要注意这个问题呢? 答:这个就要了解到vue的实现原理 。原理...

DY-Tao
昨天
10
0
web移动端学习:高德地图demo(一)

在高德地图开发中申请开发者资格,然后在控制台中新建应用,获得KEY; 新建模板HTML文件; <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>地图demo</title><scri......

dxiya
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部