h5支付_h5支付页面 - CSDN
精华内容
参与话题
  • 微信H5支付功能开发

    千次阅读 2019-06-28 10:44:03
    本文介绍的是微信H5支付功能开发,也就是在微信之外的H5页面支付。 首先我们需要先看微信的官方文档https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_1,这里面几乎介绍了全部流程了。等你了解大概流程...

    本文介绍的是微信H5支付功能开发,也就是在微信之外的H5页面支付。

    首先我们需要先看微信的官方文档https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_1,这里面几乎介绍了全部流程了。等你了解大概流程之后,需要在微信公众平台和微信商户平台拿到或者配置一下参数。

    appid:公众平台的appid

    商户号:公众平台的商户号

    商户密钥:key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置

    最后在商户平台后台产品中心-->开发配置 中添加H5支付回调域名,域名必须是通过备案的。(下图借用了某个兄弟的图,我懒得上后台截图了)

    花了不少时间去填这些坑,填完了我们就可以吭哧吭哧开工搬砖了!

    写完支付别忘了还有订单查询功能需要开发,主要为了查询出哪些王八蛋就只是来看看不买东西还占库存。不给钱的我们需要把库存要回来。

    /**

    * 保存订单并发起支付请求

    * @param request

    * @param response

    * @throws IOException 

    */

    @RequestMapping(value = "/save")

    public void save(HttpServletRequest request, HttpServletResponse response) throws IOException{

    //判断用户是否登录

    String mobileNumber = (String)request.getSession().getAttribute("mobileNumber");

    if(StringUtils.isEmpty(mobileNumber)){

    return;

    }

    response.setContentType("text/xml;charset=utf-8");

    PrintWriter out = response.getWriter();

    ResponMsg msg = new ResponMsg();

    msg.setSuccess(true);

    String content = "提交成功";

    try{

    //获取用户选择的票务信息,邮寄信息

    String ticketId = request.getParameter("ticketId");

    String ticketCount = request.getParameter("ticketCount");

    String userName = request.getParameter("userName");

    String userAddress = request.getParameter("userAddress");

    String userMobile = request.getParameter("userMobile");

     

    //参数验证

    if(StringUtils.isEmpty(ticketId) || StringUtils.isEmpty(ticketCount) || StringUtils.isEmpty(userAddress) 

    || StringUtils.isEmpty(userMobile) || StringUtils.isEmpty(userName)){

    content = "请正确且完整填写收货信息!";

    msg.setCode(-2);

    return;

    }

    //判断是否有可售票 有则创建订单预留票并发起支付

    ActTicket actTicket = showService.queryTicketById(Integer.valueOf(ticketId));

    if(actTicket.getTicketStock() - Integer.valueOf(ticketCount) < 0){

    content = "抱歉,已售完!感谢关注!";

    msg.setCode(-1);

    return;

    }

    //创建订单 

    // 自己网站上的订单号

    int randomNum  = (int) (Math.random() * 1999+5000);

    //String out_trade_no = TimeUtils.getSysTime("yyyyMMddHHmmss") + randomNum;

    String orderNO = TimeUtils.getSysTime("yyyyMMddHHmmss") + randomNum;

    ActUserAddress actUserAddress = new ActUserAddress(mobileNumber, userName, userMobile,userAddress, orderNO);

    ActOrder actOrder = new ActOrder();

    actOrder.setOrderNumber(orderNO);

    actOrder.setTicketId(actTicket.getId());

    actOrder.setProductName(actTicket.getTicketLevel());

    actOrder.setProductPrice(actTicket.getTicketPrice());

    actOrder.setProductCount(Integer.valueOf(ticketCount));

    actOrder.setTotalPay(actTicket.getTicketPrice() * Integer.valueOf(ticketCount));

    actOrder.setPayType(1);

    actOrder.setStatement(1);

    actOrder.setUserAccount(mobileNumber);

    actOrder.setActUserAddress(actUserAddress);

    System.out.println(mobileNumber + " 创建订单:" +  actOrder.toString());

    //缓存数据

    request.getSession(true).setAttribute("actOrder", actOrder);

    showService.createOrder(actOrder);

    //发起支付 

    content = "/show/wxPayH5";

    msg.setCode(9);

    }catch(Exception e){

    msg.setCode(0);

    msg.setSuccess(false);

    msg.setMessage("当前人数过多,请稍后再来。");

    e.printStackTrace();

    }finally{

    msg.setMessage(content);

    out.print(JsonUtil.toJson(msg));

    out.flush();

    out.close();

    }

    }

     

     

     

    /**

    * 微信H5支付 

    * 统一下单

    * @param request

    * @param response

    * @param model

    * @throws Exception

    */

    @RequestMapping("/wxPayH5")

    public void wxPayH5(HttpServletRequest request, HttpServletResponse response, ModelMap model) throws Exception {

    //System.out.println("pay ===== start===");

    //System.out.println("pay mobile=== " + request.getSession().getAttribute("mobileNumber").toString());

    ActOrder actOrder = (ActOrder)request.getSession(true).getAttribute("actOrder");

    System.out.println("===wxPayH5===start===actOrder===" + actOrder.toString());

    request.getSession().removeAttribute("actOrder");

    Map<String, Object> result = new HashMap<String, Object>();

    result.put("success", false);

    try {

    // 付款金额,必填

    String total_fee = String.valueOf(actOrder.getTotalPay());  //"0.01"

     

    // 账号信息

    String appid = PayConfig.APP_ID; // appid

    String mch_id = PayConfig.MCH_ID; // 商业号

    String key = PayConfig.API_KEY; // key

     

    String currTime = PayCommonUtil.getCurrTime();

    String strTime = currTime.substring(8, currTime.length());

    String strRandom = PayCommonUtil.buildRandom(4) + "";

    String nonce_str = strTime + strRandom;

    // 价格 注意:价格的单位是分

    String order_price = new BigDecimal(total_fee).multiply(new BigDecimal(100)).toString().split("\\.")[0];

    // 自己网站上的订单号

    String out_trade_no = actOrder.getOrderNumber();

    // 获取发起电脑 ip

    String spbill_create_ip = HttpUtil.getRealIp(request);

     

    // 回调接口

    String notify_url = "http://wx.xxx.com/xx/xx/payNotifyMe";

    // 页面跳转同步通知页面路径

    String trade_type = "MWEB";

     

    // 设置package订单参数

    SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();

    packageParams.put("appid", appid);

    packageParams.put("mch_id", mch_id);

    // 生成签名的时候需要你自己设置随机字符串

    packageParams.put("nonce_str", nonce_str);

    packageParams.put("out_trade_no", out_trade_no);

    packageParams.put("total_fee", order_price);

    packageParams.put("spbill_create_ip", spbill_create_ip);

    packageParams.put("notify_url", notify_url);

    packageParams.put("trade_type", trade_type);

    packageParams.put("body", PayConfig.BODY);

    packageParams.put("scene_info", "{\"h5_info\": {\"type\":\"Wap\",\"wap_url\": \"http://wx.xxxx.com\",\"wap_name\": \"测试\"}}");

    String sign = PayCommonUtil.createSign("UTF-8", packageParams, key);

    System.out.println("订单号:" + out_trade_no + " 的签名:" + sign);

    packageParams.put("sign", sign);

    String requestXML = PayCommonUtil.getRequestXml(packageParams);

    String resXml = HttpUtil.postData(PayConfig.UFDODER_URL, requestXML);

    Map map = XMLUtil.doXMLParse(resXml);

    //String urlCode = (String) map.get("code_url");

    System.out.println("out_trade_no=" + map.get("out_trade_no"));

    System.out.println("prepay_id=" + map.get("prepay_id"));

    //确认支付过后跳的地址,需要经过urlencode处理

    String urlString = URLEncoder.encode("http://wx.xxx.com/xx/xx/xx/list.html", "GBK");

    String mweb_url = map.get("mweb_url")+"&redirect_url="+urlString;

     

    //更新订单状态

    actOrder.setPayOrderNO(map.get("prepay_id").toString());

    actOrder.setStatement(2);

    actOrder.setNote(map.get("sign").toString());

    showService.updateOrderStatement(actOrder);

    System.out.println("==========mweb_url==========" + mweb_url);

    response.sendRedirect(mweb_url);

    //result.put("sHtmlText", urlCode);

    result.put("success", true);

    } catch (Exception e) {

    e.printStackTrace();

    result.put("errormsg", e.getMessage());

    }

    }

     

     

    /**

    * 执行回调 确认支付后处理事件 例如添加金额到数据库等操作

    * @param request

    * @param response

    * @throws Exception

    */

    @RequestMapping("/payNotifyMe")

    public void weixin_notify(HttpServletRequest request, HttpServletResponse response, ModelMap model)throws Exception {

    System.out.println("进入支付h5回调=====================");

    String xmlMsg = readData(request);

    System.out.println("pay notice---------"+xmlMsg);

    Map params = XMLUtil.doXMLParse(xmlMsg);

    try {

    // 过滤空 设置 TreeMap

    SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();

    Iterator it = params.keySet().iterator();

    while (it.hasNext()) {

    String parameter = (String) it.next();

    String parameterValue = params.get(parameter)+"";

    String v = "";

    if (null != parameterValue) {

    v = parameterValue.trim();

    }

    //System.out.println( parameter + " value==============="+v);

    packageParams.put(parameter, v);

    }

    //订单号

    String orderNO = packageParams.get("out_trade_no").toString().trim();

    ActOrder actOrder = new ActOrder();

    actOrder.setOrderNumber(orderNO);

    actOrder.setPayOrderNO(packageParams.get("sign").toString().trim());

    actOrder.setPayOrderNO(packageParams.get("transaction_id").toString());

    String resXml = "";

    // 处理业务开始

    if ("SUCCESS".equals((String) packageParams.get("result_code"))) {

    // 这里是支付成功 

    model.put("msg", "付款成功");

    // 执行自己的业务逻辑   更新订单状态

    actOrder.setStatement(3);

    // 通知微信.异步确认成功.必写.不然会一直通知后台.八次之后就认为交易失败了.

    resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>" + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";

    } else {

    model.put("msg", "付款失败");

    actOrder.setStatement(0);

    resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[充值失败]]></return_msg>" + "</xml> ";

    }

     

    //更新订单

    showService.updateOrderStatement(actOrder);

     

    BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());

    out.write(resXml.getBytes());

    out.flush();

    out.close();

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

     

    public static String readData(HttpServletRequest request) {

    BufferedReader br = null;

    try {

    StringBuilder result = new StringBuilder();

    br = request.getReader();

    for (String line; (line=br.readLine())!=null;) {

    if (result.length() > 0) {

    result.append("\n");

    }

    result.append(line);

    }

     

    return result.toString();

    } catch (IOException e) {

    throw new RuntimeException(e);

    }

    finally {

    if (br != null)

    try {br.close();} catch (IOException e) {e.printStackTrace();}

    }

    }

    需要完整的代码可以留言哦!可有偿指导开发完整个流程!

     

    展开全文
  • H5支付例子

    2020-07-29 14:20:04
    H5支付的例子,已经测试过;是可以用的;
  • 微信H5支付

    万次阅读 热门讨论 2019-06-22 12:04:44
    微信H5支付

    本篇文件来聊聊微信服务商模式以及商户模式下微信H5支付

    先说一个事情。8月1号开始微信公众平台支付的开发配置页面迁移至商户平台 详细说明参考这个或者看下面的截图

    平台公告   微信支付商户平台

    官方文档
    普通商户版-微信H5支付
    服务商版-微信H5支付

    1、申请开通微信H5支付

    服务商模式下H5支付

    服务商模式下点击申请开通会立即开通,邀请子商户时需要填写子商户的信息。

    服务商模式下与商户模式下主要的区别在于商户模式下不用填写特约商户信息、只需要填写商户H5支付相关的信息 如下图

    服务商H5支付

    服务商H5支付产品设置 - 微信支付商户平台

    注意
    填写的H5支付域名必须是对应网站备案的域名且备案主体还得与商户的主体信息一致。否则申请的时候不给予通过。审核反馈的周期不是很长一般是隔天就可以给出反馈。

    2、接口流程图以及常见错误

    接口流程图

    简单点概括
    1、用户使用非微信客户端浏览器下单
    2、调用微信支付接口下单得到H5支付URL的跳转链接
    3、跳转到微信唤起微信支付
    4、支付成功异步通过
    5、处理支付结果

    详细流程介绍

    1、用户在商户侧完成下单,使用微信支付进行支付
    2、由商户后台向微信支付发起下单请求(调用统一下单接口)注:交易类型trade_type=MWEB
    3、统一下单接口返回支付相关参数给商户后台,如支付跳转url(参数名“mweb_url”),商户通过mweb_url调起微信支付中间页
    4、中间页进行H5权限的校验,安全性检查(此处常见错误请见下文)
    5、如支付成功,商户后台会接收到微信侧的异步通知
    6、用户在微信支付收银台完成支付或取消支付,返回商户页面(默认为返回支付发起页面)
    7、商户在展示页面,引导用户主动发起支付结果的查询
    8,9、商户后台判断是否接到收微信侧的支付结果通知,如没有,后台调用我们的订单查询接口确认订单状态
    10、展示最终的订单支付结果给用户

    常见错误:

    1、网络环境未能通过安全验证,请稍后再试(IP改变导致的)
    2、商家参数格式有误,请联系商家解决(H5支付的referer为空导致)
    3、商家存在未配置的参数,请联系商家解决(H5支付的域名问题)
    4、支付请求已失效,请重新发起支付(有效期为5分钟)
    5、请在微信外打开订单,进行支付(H5支付不能直接在微信客户端内调起)

    3、统一下单获取支付的URL

    你做过扫码支付、公众号支付以及App支付吗?如果做过那H5支付就相当简单了,与前面的提到的几种支付方式统一下单的URL是一样的只是个别请求参数不同而已(trade_type为MWEB、scene_info必填)。如果没有做过也没有关系下面就是详细的案例了。

    /**
    	 * 微信H5 支付
    	 */
    	public void wapPay(){
    		String ip = IpKit.getRealIp(getRequest());
    		if (StrKit.isBlank(ip)) {
    			ip = "127.0.0.1";
    		}
    		
    		H5ScencInfo sceneInfo = new H5ScencInfo();
    		
    		H5 h5_info = new H5();
    		h5_info.setType("Wap");
    		h5_info.setWap_url("https://pay.qq.com");
    		h5_info.setWap_name("腾讯充值");
    		sceneInfo.setH5_info(h5_info);
    		
    		Map<String, String> params = WxPayApiConfigKit.getWxPayApiConfig()
    				.setAttach("IJPay H5支付测试  -By Javen")
    				.setBody("IJPay H5支付测试  -By Javen")
    				.setSpbillCreateIp(ip)
    				.setTotalFee("520")
    				.setTradeType(TradeType.MWEB)
    				.setNotifyUrl(notify_url)
    				.setOutTradeNo(String.valueOf(System.currentTimeMillis()))
    				.setSceneInfo(h5_info.toString())
    				.build();
    		
    		String xmlResult = WxPayApi.pushOrder(false,params);
    log.info(xmlResult);
    		Map<String, String> result = PaymentKit.xmlToMap(xmlResult);
    		
    		String return_code = result.get("return_code");
    		String return_msg = result.get("return_msg");
    		if (!PaymentKit.codeIsOK(return_code)) {
    			ajax.addError(return_msg);
    			renderJson(ajax);
    			return;
    		}
    		String result_code = result.get("result_code");
    		if (!PaymentKit.codeIsOK(result_code)) {
    			ajax.addError(return_msg);
    			renderJson(ajax);
    			return;
    		}
    		// 以下字段在return_code 和result_code都为SUCCESS的时候有返回
    		
    		String prepay_id = result.get("prepay_id");
    		String mweb_url = result.get("mweb_url");
    		
    		renderText("prepay_id:"+prepay_id+" mweb_url:"+mweb_url);
    	}
    

    在手机浏览器中访问mweb_url即可唤起微信进行支付

    更正 20170830
    1、上面复制mweb_url到手机浏览器访问会出现网络环境未能通过安全验证,请稍后再试 为什么呢? 因为发起支付与唤起支付的IP不一致
    2、微信H5支付必须在设置的域名(商户平台–“产品中心”–“开发配置”)网页中发起支付不然会出现商家参数格式有误,请联系商家解决 为什么呢? 因为微信H5支付需要验证支付的referer

    更正后的代码如下:

    /**
    	 * 微信H5 支付
    	 * 注意:必须再web页面中发起支付且域名已添加到开发配置中
    	 */
    	public void wapPay(){
    		String ip = IpKit.getRealIp(getRequest());
    		if (StrKit.isBlank(ip)) {
    			ip = "127.0.0.1";
    		}
    		
    		H5ScencInfo sceneInfo = new H5ScencInfo();
    		
    		H5 h5_info = new H5();
    		h5_info.setType("Wap");
    		//此域名必须在商户平台--"产品中心"--"开发配置"中添加
    		h5_info.setWap_url("https://pay.qq.com");
    		h5_info.setWap_name("腾讯充值");
    		sceneInfo.setH5_info(h5_info);
    		
    		Map<String, String> params = WxPayApiConfigKit.getWxPayApiConfig()
    				.setAttach("IJPay H5支付测试  -By Javen")
    				.setBody("IJPay H5支付测试  -By Javen")
    				.setSpbillCreateIp(ip)
    				.setTotalFee("520")
    				.setTradeType(TradeType.MWEB)
    				.setNotifyUrl(notify_url)
    				.setOutTradeNo(String.valueOf(System.currentTimeMillis()))
    				.setSceneInfo(h5_info.toString())
    				.build();
    		
    		String xmlResult = WxPayApi.pushOrder(false,params);
    log.info(xmlResult);
    		Map<String, String> result = PaymentKit.xmlToMap(xmlResult);
    		
    		String return_code = result.get("return_code");
    		String return_msg = result.get("return_msg");
    		if (!PaymentKit.codeIsOK(return_code)) {
    			ajax.addError(return_msg);
    			renderJson(ajax);
    			return;
    		}
    		String result_code = result.get("result_code");
    		if (!PaymentKit.codeIsOK(result_code)) {
    			ajax.addError(return_msg);
    			renderJson(ajax);
    			return;
    		}
    		// 以下字段在return_code 和result_code都为SUCCESS的时候有返回
    		
    		String prepay_id = result.get("prepay_id");
    		String mweb_url = result.get("mweb_url");
    		
    		System.out.println("prepay_id:"+prepay_id+" mweb_url:"+mweb_url);
    		redirect(mweb_url);
    	}
    
    

    在Web页面中发起支付

    如果你下载的是Jfinal版本的Demo 访问的URL为
    http://域名:端口号/toWxH5Pay

    具体实现可以参考开源项目 IJPay 让支付触手可及

    推荐阅读
    极速开发微信公众号
    基于 CentOS 搭建 FTP 文件服务
    基于 CentOS Mysql 5.7.19 安装与主从同步配置详解
    Redis4.0.1安装以及主从复制详解
    10分钟搭建属于自己的ngork服务器,实现内网穿透

    展开全文
  • 支付宝h5支付(java版)

    千次阅读 热门讨论 2019-08-26 16:13:03
    移动应用1.3、选择支付接入1.4、创建应用,输入名称(选择网页应用)1.5、创建成功1.6、下载签名工具,地址:https://docs.open.alipay.com/291/105971/ ,下载windows,点击:RSA签名验签工具1.7、点击生成秘钥,...

    1、准备工作

    支付宝开发api(手机网站支付):https://docs.open.alipay.com/api_1/alipay.trade.wap.pay

    1.1、登录蚂蚁金服开放平台

    https://open.alipay.com/platform/manageHome.htm

    2.2、选择开发者中心 -》网站&移动应用

    在这里插入图片描述

    1.3、选择支付接入

    在这里插入图片描述

    1.4、创建应用,输入名称(选择网页应用)

    命名有一定要求,可以查看命名规范:https://docs.open.alipay.com/200/105319
    在这里插入图片描述

    1.5、创建成功

    在这里插入图片描述

    1.6、下载签名工具,地址:https://docs.open.alipay.com/291/105971/ ,下载windows,点击:RSA签名验签工具

    在这里插入图片描述

    1.7、点击生成秘钥,生成商户私钥和应用秘钥,并且会以文本(txt)的方式保存起来

    在这里插入图片描述

    1.8 回到开放平台 的应用完善页面,点击设置应用公钥,接收验证码,输入上一步生成的商户应用公钥,点击确定。然后会生成对应的支付宝公钥,商户应用公钥和支付宝公钥要明确区分开,开发代码中要使用到 支付宝公钥 和 商户应用私钥

    可以直接在这个网址里面进行设置:https://openhome.alipay.com/platform/keyManage.htm
    在这里插入图片描述

    1.9、提交审核,一天之后,审核完成,显示应用上线。此后,可以开始后台代码开发。(正式项目需要商户签约)

    2、代码开发

    2.1 引入java sdk包
    <dependency>
        <groupId>com.alipay.sdk</groupId>
        <artifactId>alipay-sdk-java</artifactId>
        <version>3.7.26.ALL</version>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.1.1</version>
    </dependency>
    
    
    2.2 开发配置类
    package com.shop.constants;
    
    /**
     *类名:AlipayConfig
     *功能:基础配置类
     *详细:设置帐户有关信息及返回路径
     *修改日期:2019-04-30
     *说明:
     *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
     *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 
     */
    public class AlipayConfig {
    	//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    
        // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
        public static String app_id = "20160******";
    
        // 商户私钥,您的PKCS8格式RSA2私钥
        public static String merchant_private_key = "*******";
    
        // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
        public static String alipay_public_key = "********";
    
        // 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
        public static String notify_url = "https://www.alipay.com";
    
        // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,沙箱环境下可以填写本地地址
        public static String return_url = "http://localhost:8082/web/pay/callback";
    
        // 签名方式
        public static String sign_type = "RSA2";
    
        // 字符编码格式
        public static String charset = "utf-8";
    
        // 支付宝网关
        public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
    
    //销售产品码,商家和支付宝签约的产品码,默认值为:QUICK_WAP_WAY
        public static String productCode ="QUICK_WAP_WAY";
    
    
    //↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
    
    
    }
    
    
    2.3 开发工具类

    参数详情请看这里:https://docs.open.alipay.com/204/105301/

    
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    
    import com.alipay.api.AlipayApiException;
    import com.alipay.api.AlipayClient;
    import com.alipay.api.DefaultAlipayClient;
    import com.alipay.api.internal.util.AlipaySignature;
    import com.alipay.api.request.AlipayTradeRefundRequest;
    import com.alipay.api.request.AlipayTradeWapPayRequest;
    import com.shop.constants.AlipayConfig;
    import com.shop.constants.BakConstants;
    
    public class PayUtil {
    	
    	/**
    	 * @Title: alipay   
    	 * @Description: TODO(支付)   
    	 * @param outTradeNo  商户订单号,商户网站订单系统中唯一订单号,必填   对应缴费记录的orderNo
         * @param totalAmount  付款金额,必填
         * @param subject 主题
         * @param body 商品描述,可空
    	 * @param: @return
    	 * @param: @throws Exception      
    	 * @return: String      
    	 * @throws
    	 */
        public static String alipay(String outTradeNo,String totalAmount,String subject,String body) throws Exception{
            //获得初始化的AlipayClient
            AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, 
            		AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, 
            		AlipayConfig.sign_type);
    
            
            //该笔订单允许的最晚付款时间
            String timeout=30m;
            //设置请求参数
            String content = "{\"out_trade_no\":\""+ outTradeNo +"\"," 
                    + "\"total_amount\":\""+ totalAmount +"\"," 
                    + "\"subject\":\""+ subject +"\"," 
                    + "\"timeout_express\":\""+ timeout +"\"," 
                    + "\"body\":\""+ body +"\"," 
                    + "\"product_code\":\""+AlipayConfig.productCode+"\"}";
            AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
            alipayRequest.setReturnUrl(AlipayConfig.return_url);
            alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
            alipayRequest.setBizContent(content);                                                                                                                                                               
         
            //请求
            String result="";
            result = alipayClient.pageExecute(alipayRequest).getBody();
            return result;
        }
    
        /**
         * 支付宝退款接口
         * @param outTradeNo
         * @param tradeNo
         * @param refundAmount
         * @param refundReason
         * @param out_request_no  标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传
         * @return
         */
        public static String aliRefund(String outTradeNo,String tradeNo,String refundAmount,String refundReason,String out_request_no) {
            //获得初始化的AlipayClient
                    AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
    
                    //设置请求参数
                    AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();
                    alipayRequest.setReturnUrl(AlipayConfig.return_url);
                    alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
                    try {               
                        alipayRequest.setBizContent("{\"out_trade_no\":\""+ outTradeNo +"\"," 
                                + "\"trade_no\":\""+ tradeNo +"\"," 
                                + "\"refund_amount\":\""+ refundAmount +"\"," 
                                + "\"refund_reason\":\""+ refundReason +"\"," 
                                + "\"out_request_no\":\""+ out_request_no +"\"}");                                                                                                                                                               
    
                    //请求
                    String result;
    
                    //请求
                    result = alipayClient.execute(alipayRequest).getBody();
                    System.out.println("*********************\n返回结果为:"+result);
                    return result;
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        return null;
                    }
        }
    
        /**
         * 支付宝的验签方法
         * @param req
         * @return
         */
        public static boolean checkSign(HttpServletRequest req) {
            Map<String, String[]> requestMap = req.getParameterMap();
            Map<String, String> paramsMap = new HashMap<>();
            requestMap.forEach((key, values) -> {
                  String strs = "";
                  for(String value : values) {
                  strs = strs + value;
                  }
                  System.out.println(("key值为"+key+"value为:"+strs));
                  paramsMap.put(key, strs);
                });
    
            //调用SDK验证签名
            try {
                return  AlipaySignature.rsaCheckV1(paramsMap, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type);
            } catch (AlipayApiException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                System.out.println("*********************验签失败********************");
                return false;
            }
        }
    
    }
    
    
    2.4、此时,即可打开支付宝登录页面。在手机端访问可以打开支付宝客户端
    2.5、回调方法和支付完成的返回方法。

    回调的方法是在AlipayConfig 类下有个return_url 是该应用回调的地址

    2.6、回调接收参数:
    import java.math.BigDecimal;
    
    public class AlipayNotifyParam {
    
    	private String charset;//编码格式
    	private String out_trade_no;//商户网站唯一订单号
    	private String trade_no;//该交易在支付宝系统中的交易流水号。最长64位
    	private String method;
    	private BigDecimal total_amount;//该笔订单的资金总额
    	private String sign;//签名结果
    	private String auth_app_id;
    	private String app_id;//支付宝分配给开发者的应用Id
    	private String sign_type;//签名类型
    	private String seller_id;//收款支付宝账号对应的支付宝唯一用户号。以2088开头的纯16位数字
    	private String timestamp;//时间
    
    	//get和set省略
    	}
    	
    

    3、沙箱环境

    在开发中心-》研发服务-》沙箱
    沙箱:https://docs.open.alipay.com/200/105311/
    简单而言就是支付宝测试环境 ,有一个沙箱账号:买家账号和一个卖家账号,可以进行模拟支付
    在这里插入图片描述
    在这里插入图片描述

    最后做完一系列 订单操作。支付完成返回页可以是订单详情页。

    有不懂得地方请在下放进行留言,小农看到了,会第一时间回复大家,谢谢

    在这里插入图片描述

    展开全文
  • 支付宝h5网页的支付

    千次阅读 2019-05-27 22:35:13
    支付宝h5网页的支付 最近上线一个理财项目,手机网站进行调起支付宝App支付,做起来还是满顺手的,在此做个记录。 1、首先签约手机网站支付 进入商家中心,进行手机网站支付签约 这个是签约之后的状态,如果...

                                                                                   支付宝h5网页的支付

    最近上线一个理财项目,手机网站进行调起支付宝App支付,做起来还是满顺手的,在此做个记录。

    1、首先签约手机网站支付

    进入商家中心,进行手机网站支付签约

    这个是签约之后的状态,如果没有进行接入,直接进行接入就行

    签约详情

    2、官网接口了解

    1、支付宝手机网站支付官方了解,看文档,感觉比博客里面出来的靠谱多了,踩过很多坑。手机的支付流程效果图,可以是这样,都是大同小异的。

    公钥和私钥的如何获取,就不说了,现在网上有很多,现在直接说官方demo

    2、将项目导入Eclipse,Idea等开发工具,支付配置

    appId:只需要配置自己的商户appId

    私钥(RSA_PRIVATE_KEY)和公钥(ALIPAY_PUBLIC_KEY):只需要配置成自己的就行

    notify_url和return_url:只需要外网能够访问,可以采用花生壳

    3、项目访问

    启动项目进行访问:http://localhost:8081/alipay.trade.wap.pay-java-utf-8/,项目端口可以进行配置

    1、项目支付选择

    2、订单详情页面

    3、确认支付页面

    4、输入密码界面

    5、支付完成,并点击完成,点击完成,会进行return_url的跳转,可以参考demo下面的return_url.jsp

    demo中提供的响应处理

    6、支付完成的响应通知完成自己的订单业务,并进行状态的修改,截取的代码都是获取参数和校验签名,后面处理自己的业务,最后支付宝如果处理成功只需要返回两种情况,分别是

     

    //支付宝支付
    public static String ALIPAY_RESPONSE_SUCCESS = "success";
    public static String ALIPAY_RESPONSE_FAILED = "failed";

     

    展开全文
  • 手把手教你完成微信H5支付

    千次阅读 2019-08-16 13:52:58
    关于微信支付支付,个人觉得相比支付宝复杂的太多了,但是慢慢理解起来还是很简单的 1,首先准备工作,下方是一个时序图,认真看,图看懂了做起来真的很简单 , 2,第二按照上图说明,开始下单时,调用微信下单接口是需要...
  • 微信支付之H5支付

    千次阅读 2018-05-03 16:39:14
    先看下H5支付的官方描述吧: H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付。 主要用于触屏版的手机浏览器请求微信支付的...
  • h5支付——前端需要处理什么?

    万次阅读 2018-07-20 10:50:08
    最近做了一个跟h5支付(其实就是微信h5支付)相关的模块,由于是初次接触,特来分享下,前端在h5支付功能这需要处理一些什么,以及遇到的坑点处理   首先,我们应该先了解一下h5支付的相关API:[h5支付文档] ...
  • 支付宝H5支付

    万次阅读 2018-10-29 16:43:56
    一、应用开发前准备工作 ... 2、开发者中心--&gt;网站&amp;...3、点击支付接入 ...4、创建应用,输入名称(注意:名称中不要含有支付宝,阿里巴巴等字样,亲测aliPay也不行) ...5、修改应用图标(不要使用其他网站...
  • 个人微信支付宝免签约解决方案整理:http://www.likeyunba.com/demo/PAYDEMO/index.html 作者:TANKING
  • 之前没有做过微信支付,在CSDN找了很多案例都没有看明白, 下载后要么是不完整缺少文件,要么是各种原因...要求是传递一个金额值给用户H5页面,用户微信支付。 微信dll306181140,着急在线等,如果能解决问题还可以加分
  • 小程序实现h5页面的微信支付

    万次阅读 2019-02-15 16:03:40
    之前的h5项目虽然实现了微信支付,但是嵌套之后小程序无法直接使用之前的h5支付功能。为了达到兼容,因为支付页面是同一个,所以项目必须同时兼容两个支付,一个是原本h5项目的支付能正常使用,另一个是当在小程序中...
  • iOS 封装的H5 APP 调用微信H5支付,进入微信支付界面后,点击取消,或者支付完成返回不能返回到App,而是打开了手机系统的safari浏览器。 用的h5+ 请问有解决方案吗
  • H5支付(支付宝)开通流程

    万次阅读 2018-08-20 20:41:44
    登陆支付宝 1、登陆支付宝-》进入产品中心 (网址:... 2、找到手机网站支付,按照流程接入 3、申请审核之后进入【蚂蚁金服开放平台】 (网址:https://open.alipay.com/platform/manageHome.ht...
  • php 微信H5支付源码示例(超简单)

    千次阅读 2018-07-29 17:33:54
    超简单,超好用。。。。简单修改参数就行 转载:https://download.csdn.net/download/computer001/10371433
  • 在iOS的webview中,h5自己调用微信支付,能够成功起调,并且能完成支付,但是点击完成时,跳转到safari浏览器中,并不能跳回app。
  • 微信H5支付遇到的坑

    万次阅读 2018-02-09 15:50:07
    1. 当前调起H5支付的referer为空导致,一般是因为直接访问页面调起H5支付,请按正常流程进行页面跳转后发起支付,或自行抓包确认referer值是否为空 2. 如果是APP里调起H5支付,需要在webview中手动设置referer,如 ...
  • 前端支付宝授权h5页面完成支付

    万次阅读 2018-09-29 15:47:01
    项目背景:项目是vue写的一个h5页面,主要功能就是用支付宝扫码跳转到项目页面,选择信用支付或转账支付,输入金额,计算费率,完成付款。 项目难点:页面是h5网页,用支付宝支付必须得到支付宝授权,调用支付宝的...
  • 先将最终获取到的微信链接打印出来,发现只有 http://xxxxxxxxxxpackge=1234546http....(后面这段是redirect_url) 所以确定是最后的redirect_url参数只有值没有键。改为: ...amp;redirect_url=http.... 解决 ...
  • 有几个点描述下, 1.代码应该问题不大。... 2.我在iis日志中发现,微信有给我服务器post 这个地址。只是代码没有调用,标识302 3.我在这个回调页中第一行代码就输出调试代码,没反应。证明调用没有进来过。...
1 2 3 4 5 ... 20
收藏数 15,913
精华内容 6,365
关键字:

h5支付