介绍:
这是放在微信供公众号内的一个项目,支付模块设计到微信公众号支付和支付宝手机网站支付,这次把支付宝手机网站支付整理下来。

文档:
支付宝手机网站支付的开发文档: https://docs.open.alipay.com/203

签约:
首先要到支付宝开发者后台去签约支付宝手机网站支付方式。签约的要求是必须有能访问的网页,网页上有标明价格、名称等详细信息的商品,而且整个下单流程要完善,网站的完成度要高,这才能通过审核。

参考:
因为之前对接过支付宝的app支付,所以对接wap支付就容易得多。后台拼接参数的思路、方式都和之前一样。直接复用之前的代码,只需稍微修改几个参数就可以。
参见上一篇支付宝APP支付:http://blog.csdn.net/tonyfreak/article/details/78104519

思路:
1、先到支付宝开放平台创建应用获取APPID
2、配置应用的相关参数,签约申请开通对应的支付类型
3、获得支付权限后就可以着手进行代码编写:
①、组装参数分为公共请求参数和业务请求参数两部分。详见:https://docs.open.alipay.com/203/107090/
②、先把业务请求参数转成json放入公共请求参数biz_content 中
③、将公共请求参数进行签名操作
④、将签名后获得的签名参数放入公共请求参数sign中
⑤、将此时的公共请求参数进行url编码
⑥、将json数据传给前端

微信公众平台无法使用支付宝收付款的解决方案
微信中无法打开支付宝收款是微信浏览器限制所致,可以参考下图方法引导用户转到系统浏览器,即可用支付宝收款。点此下载。

微信中调用支付宝支付效果展示

后台代码

组装参数

/*** 封装好参数,前台通过form表单来调起支付宝*/@RequestMapping("/alipayPayChongRequest")@ApiOperation(value="支付宝充值起调的接口",httpMethod="POST",response=JsonUtil.class,notes="支付宝充值起调的接口---/alipayPayChongRequest")public void alipayPayChongRequest(@ApiParam(required=true,name="orderNumber",value="订单编号")@RequestParam(value="orderNumber") String orderNumber,@ApiParam(required=true,name="orderTitle",value="订单标题")@RequestParam(value="orderTitle") String orderTitle,@ApiParam(required=true,name="description",value="订单描述")@RequestParam(value="description") String description){try{if(orderNumber !=null && !orderNumber.equals("") && orderTitle !=null && !orderTitle.equals("")&& description !=null && !description.equals("")){BusWalletChong chong = busWalletChongService.findBusWalletChongById(orderNumber);// 根据订单主键id查询,订单编号就是主键idString saleMoney = chong.getPrice().toString();// 公共请求参数Map<String, String> param = new HashMap<>();                 param.put("app_id", AlipayConfig.appId);    // 应用appIdparam.put("method", "alipay.trade.wap.pay"); // 接口名称param.put("format", "json"); //数据类型param.put("charset", AlipayConfig.input_charset);//编码格式param.put("timestamp", DatetimeUtil.formatDateTime(new Date()));//发送请求时间param.put("version", "1.0");//调用接口版本,固定为1.0param.put("notify_url", AlipayConfig.notify_url_chong);// 支付宝服务器主动通知商户服务param.put("sign_type", AlipayConfig.sign_type);//签名类型          // 支付业务请求参数Map<String, Object> pcont = new HashMap<>();                 pcont.put("out_trade_no", orderNumber);// 订单号(综合采购单编号)pcont.put("total_amount", String.valueOf(saleMoney));// 交易金额pcont.put("subject", orderTitle); // 订单标题pcont.put("body", description); // 对交易或商品的描述pcont.put("product_code", "QUICK_WAP_WAY");                  // 销售产品码           param.put("biz_content", JSON.toJSONString(pcont));           // 业务请求参数  不需要对json字符串转义Map<String, String> payMap = new HashMap<>();try {param.put("sign", PayUtil.getSign(param, AlipayConfig.private_key)); // 业务请求参数String orderStr = PayUtil.getSignEncodeUrl(param, true);System.out.println(orderStr);payMap.put("orderStr", orderStr);} catch (Exception e) {e.printStackTrace();}           map1.put("msg", "成功");map2.put("result", payMap);}else{map1.put("msg", "参数不全");}                   } catch (BusinessException e) {e.printStackTrace();map1.put("msg", "发生后台异常");}map.put("data", map2);map.put("result", map1);JsonUtil.writeJson(response, JsonUtil.objectToJson(map));           }

支付回调

/*** 支付宝充值成功的回调接口*/@RequestMapping("/alipayPayCallBackWallet")@ApiOperation(value="支付宝充值成功的回调接口",httpMethod="POST",response=JsonUtil.class,notes="支付宝充值成功的回调接口---pay/alipayPayCallBackWallet")public String alipayPayCallBackWallet(){try {// 获取支付宝POST过来反馈信息Map<String, String> params = new HashMap<String, String>();Map requestParams = request.getParameterMap();for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {String name = (String) iter.next();String[] values = (String[]) requestParams.get(name);String valueStr = "";for (int i = 0; i < values.length; i++) {valueStr = (i == values.length - 1) ? valueStr + values[i]: valueStr + values[i] + ",";}// 乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");params.put(name, valueStr);}// 获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//// 商户订单号String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");// 支付宝交易号String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");// 充值金额String price = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8");// 获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//boolean check = AlipayNotify.verify(params);if (check) {// 验证成功// // 请在这里加上商户的业务逻辑程序代码String orderNo = out_trade_no;// 提交订单返回的订单编号// 支付宝交易号String alipayOrderNo = trade_no;BusWalletChong chong = busWalletChongService.findBusWalletChongById(orderNo);if(chong != null && !"".equals(chong)){if("1".equals(chong.getStatus())){// 支付状态为:已支付response.getWriter().write(setXML("SUCCESS", ""));}else{BusWalletChong newChong = new BusWalletChong();newChong.setPrice(new BigDecimal(price));newChong.setPayId(alipayOrderNo);newChong.setPayType(BusWalletChong.ALIPAY_ZHIFU_TYPE);newChong.setId(orderNo);boolean flag = busWalletChongService.updateWallet(newChong);if(flag){response.getWriter().write(setXML("SUCCESS", ""));}else{response.getWriter().write(setXML("FAIL", ""));}}}else{response.getWriter().write(setXML("FAIL", ""));}response.getWriter().write("SUCCESS"); } else {// 验证失败response.getWriter().write("FAIL");}} catch (Exception e) {e.printStackTrace();}return null;}
public static String setXML(String return_code, String return_msg) {return "<xml><return_code><![CDATA[" + return_code + "]]></return_code><return_msg><![CDATA[" + return_msg+ "]]></return_msg></xml>";}

签名工具类

/*** 对支付参数信息进行签名* * @param map*            待签名授权信息* * @return*/public static String getSign(Map<String, String> map, String rsaKey) {List<String> keys = new ArrayList<String>(map.keySet());// key排序Collections.sort(keys);StringBuilder authInfo = new StringBuilder();boolean first = true;for (String key : keys) {if (first) {first = false;} else {authInfo.append("&");}authInfo.append(key).append("=").append(map.get(key)); }return SignUtils.sign(authInfo.toString(), rsaKey);}

签名编码工具类

/*** 返回签名编码拼接url* * @param params* @param isEncode* @return*/public static String getSignEncodeUrl(Map<String, String> map, boolean isEncode) {String sign = map.get("sign");String encodedSign = "";if (CollectionUtil.isNotEmpty(map)) {map.remove("sign");List<String> keys = new ArrayList<String>(map.keySet());// key排序Collections.sort(keys);StringBuilder authInfo = new StringBuilder();boolean first = true;// 是否第一个for (String key: keys) {if (first) {first = false;} else {authInfo.append("&");}authInfo.append(key).append("=");if (isEncode) {try {authInfo.append(URLEncoder.encode(map.get(key), AlipayConstants.CHARSET_UTF8));} catch (UnsupportedEncodingException e) {e.printStackTrace();}} else {authInfo.append(map.get(key));}}try {encodedSign = authInfo.toString() + "&sign=" + URLEncoder.encode(sign, AlipayConstants.CHARSET_UTF8);} catch (UnsupportedEncodingException e) {e.printStackTrace();}}return encodedSign.replaceAll("\\+", "%20");}

前端代码

//点击支付宝付款function payByAli(orderId,description,title){$.ajax({data:{orderNumber:orderId,orderTitle:title,description:description},dataType:"json",type:"post",async: false,url:"${ctxPath}/payZhiFuBao/alipayPayRequest",success:function(msg){if(msg.result.msg == "成功"){//获取拼接好的urlvar url = msg.data.result.orderStr;var urls = "https://mapi.alipay.com/gateway.do?"+url;console.log(urls);$(".ali").attr("href",urls);}},error:function(msg){}});}

支付--支付宝手机网站支付(WAP)相关推荐

  1. 支付宝手机网站支付签约强开WAP支付,提示“系统综合评估签约条件不满足”或不满足国家法律法规或支付宝用户服务协议等的解决方案!支付宝H5支付开通方法详解

    一.如何开通支付宝手机网站支付 正常来说,按照官方的指引要求填写相关资料,即可开通支付宝手机网站支付.但是,更多的时候我们的申请都会碰到一些阻力,常见的阻力就是"系统综合评估签约条件不满足, ...

  2. php手机网站支付宝_PHP实现支付宝手机网站支付功能

    PHP实现支付宝手机网站支付功能的方法:首先开通支付宝商家中心里面的手机网站支付:然后进入开发者中心,获取到APPID:接着去文档中心下载"DEMO":最后将"demo& ...

  3. 支付宝手机网站支付实战踩坑

    准备 需求 需求就是最简单的对接支付宝支付接口 方案心路历程 简单用http对接一下,不过想了一下觉得第三方提供的SDK总是不用,所以打算尝试一下 支付宝新版SDK,从文档到git再安装到使用,然后放 ...

  4. 4 支付宝手机网站支付demo讲解

    目录 1 引言 2 业务流程 3 用户下单 4 商户系统处理订单信息 5 支付宝向用户展示支付信息 6 用户付款 7 同步通知与异步通知 1 引言 前面三小节我们已经学过如何使用支付宝手机网站支付的功 ...

  5. 对接支付宝手机网站支付接口,alin10071

    最近项目要增加支付宝扫二维码实现h5支付的功能,我们采用了调用支付宝手机网站支付接口:alipay.trade.wap.pay 但是每次调起返回都是 无可用支付方式 测了一天才发现是因为我的支付宝余额 ...

  6. 支付宝支付之扫码支付(电脑网站支付)、H5支付(手机网站支付)相关业务流程分析总结

    前言 在上一篇文章<微信支付之扫码支付.公众号支付.H5支付.小程序支付相关业务流程分析总结>中,分析和总结了微信支付相关支付类型的业务流程,这里作为与微信支付平起平坐不相伯仲的支付宝支付 ...

  7. Payment:支付宝手机网站支付教程

    支付宝的H5支付体验真不错(支付宝叫他手机网站支付). 反观微信支付干嘛要把H5支付藏起来?而且体验还那么差. Payment 3.0 支付宝的配置设置文档请 点击这里 项目GitHub地址:http ...

  8. 【支付宝支付】Java实现支付宝手机网站支付流程

    前言 微信登录网页授权与APP授权 微信JSAPI支付 微信APP支付 微信APP和JSAPI退款 支付宝手机网站支付 支付宝APP支付 支付宝退款 以上我都放到个人公众号,搜一搜:JAVA大贼船,文 ...

  9. 支付宝手机网站支付,app支付,PC端支付流程以及服务端php支付下单,回调流程详解

    一.支付宝支付相关文档地址: 支付宝支付相关的文档地址:https://open.alipay.com/api 电脑网站支付:https://opendocs.alipay.com/open/270/ ...

最新文章

  1. BZOJ4974 字符串大师(kmp)
  2. mysql 5.0 数据库_mysql5.0常用命令
  3. 怀化学院计算机科学专业排名,2019怀化学院专业排名
  4. cmdline常用参数
  5. 开源飞控爱好者_开源爱好者的10种节日礼物创意
  6. 业务监控系统如何做,一起来看看如何使用Statsd+Graphite+Grafana搭建业务监控系统
  7. 查看linux 系统情况,LINUX 查看当前系统的负载情况
  8. 一文带你了解Java反射机制
  9. 设计模式之三:观察者模式
  10. 数据中台建设的9大误区,你中了几条?
  11. Visio—如何画虚线?
  12. 固定资产管理流程步骤
  13. 计算机组成与原理第二章,计算机组成原理《第二章》
  14. 配置javaw.exe双击运行jar包
  15. 基于Java的对称加密算法和非对称加密算法
  16. Android OpenGL ES 2.0(六)--- 纹理过滤
  17. Java集成融云服务端
  18. css设overflow:hiden行内元素会发生偏移的现象
  19. Android系统开机logo
  20. 考研机试真题--素数--北京航空航天大学

热门文章

  1. 程序员的内功修炼指南
  2. mysql数据库中count的作用_MySQL数据库中的count的用法
  3. 自学资源(视频+文本)
  4. React 模拟点击事件
  5. 【笔记分享】H桥电机正反转
  6. 【adcdn优化案例】某工具类app广告优化收益增长275%经验分享
  7. Android studio下载及安装方法
  8. 面向对象基础案例(2)
  9. 多表联查时的sql删除语句的写法,即级联删除,将相关联的数据级联删除
  10. Ubuntu16.04搜索不到wifi列表