支付宝-电脑网站支付

简介: 电脑网站支付,也称扫码支付,是专门针对PC端业务而开发的一种支付方式,既有支付宝提供在网页展示一个动态生成的支付二维码,用户通过手机支付宝扫码以后可实现支付功能的一种支付方式。

1、概念

电脑网站支付,也称扫码支付,是专门针对PC端业务而开发的一种支付方式,既有支付宝提供在网页展示一个动态生成的支付二维码,用户通过手机支付宝扫码以后可实现支付功能的一种支付方式。

image.png

2、创建应用

登录支付宝开放平台(open.alipay.com),创建应用,应用审核通过会生成一个APPID。

image.png

3、签约电脑网站支付功能

在 能力列表 中点击 添加能力来添加电脑网站支付功能,并签约方可调用

image.png

4、配置应用公钥和应用私钥

参考文档,非常详细
https://opendocs.alipay.com/open/270/105899

5、接入SDK

/**
* 电脑网站支付
* https://docs.open.alipay.com/270/105899/
* @paramhttpResponse
* @throws ServletException
* @throws IOException
*/
public static void pcWebPay(String amount,HttpServletResponse httpResponse) {
  AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); //获得初始化的AlipayClient
  AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();//创建API对应的request
  alipayRequest.setReturnUrl("https://www.baidu.com");
  alipayRequest.setNotifyUrl("https://xxx.xxx.com/abc/alipay/pcWebPayCallBack");//在公共参数中设置回跳和通知地址
  alipayRequest.setBizContent("{" +
          "    \"out_trade_no\":\""+System.currentTimeMillis()+"\"," +
          "    \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +
          "    \"total_amount\":"+amount+"," +
          "    \"subject\":\"Iphone6 16G\"," +
          "    \"body\":\"Iphone6 16G\"," +
          "    \"passback_params\":\"123&456&789"," +
          "    \"extend_params\":{" +
          "    \"sys_service_provider_id\":\""+System.currentTimeMillis()+"\"" +
          "    }"+
          "  }");//填充业务参数
  try {
      String form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
      httpResponse.setContentType("text/html;charset=" + CHARSET);
      httpResponse.getWriter().write(form);//直接将完整的表单html输出到页面
      httpResponse.getWriter().flush();
      httpResponse.getWriter().close();
  } catch (AlipayApiException e) {
      e.printStackTrace();
  } catch (IOException e) {
      e.printStackTrace();
  }
}
    
/**
* 扫码支付回调 当收银台调用预下单请求API生成二维码展示给用户后,用户通过手机扫描二维码进行支付,支付宝会将该笔订单的变更信息,沿着商户调用预下单请求时所传入的通知地址主动推送给商户。
* 通知参数说明 https://docs.open.alipay.com/194/103296/
* 程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是 success 这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h);
* 程序执行完成后,该页面不能执行页面跳转。如果执行页面跳转,支付宝会收不到 success 字符,会被支付宝服务器判定为该页面程序运行出现异常,而重发处理结果通知;
* @paramalipayPublicKey
* @paramrequest
* @return
*/
public static void qrcodePayCallBack(String alipayPublicKey, HttpServletRequest request, HttpServletResponse response) {
  Map<String, String> result = 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] + ",";
      }
      //乱码解决,这段代码在出现乱码时使用。
      //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
      result.put(name, valueStr);
  }

  //支付宝交易凭证号
  String tradeNo = result.get("trade_no");
  //原支付请求的商户订单号
  String outTradeNo = result.get("out_trade_no");
  String appId = result.get("app_id");
  String sellerId = result.get("seller_id");
  String totalAmount = result.get("total_amount");
  String body = result.get("body");
  logger.info("tradeNo=={},outTradeNo=={},appId=={},sellerId=={},totalAmount=={},body=={}",tradeNo,outTradeNo,appId,sellerId,totalAmount,body);
        //切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。  
  try {
      boolean flag = AlipaySignature.rsaCheckV1(result, alipayPublicKey, CHARSET, SIGN_TYPE);
      logger.info("支付宝回调结果===========" + flag);
      if (flag) {
          logger.info("支付宝回调success===========");
          toAliPayResult = "success";
      } else {
          logger.info("支付宝回调failure===========");
          toAliPayResult = "failure";
      }
      //用字节流形式打印success,解决支付宝重复回调
      BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
      out.write(toAliPayResult.getBytes());
      out.flush();
      out.close();
  } catch (AlipayApiException e) {
      e.printStackTrace();
  } catch (IOException e) {
      e.printStackTrace();
  }
}

image.png

6、测试

image.png

image.png

image.png

image.png

山水有相逢,来日皆可期,谢谢阅读,我们再会

我手中的金箍棒,上能通天,下能探海

上一篇:mac安装Elasticsearch

相关文章
|
XML 存储 安全
微信支付宝支付真的安全吗?为什么没人攻击
微信支付宝支付真的安全吗?为什么没人攻击
|
Java 数据安全/隐私保护
支付宝支付功能使用
支付宝支付功能使用
|
小程序 IDE Serverless
支付宝小程序云内测福利发放
参与小程序云开发邀测活动,做首批内测用户
142 0
|
测试技术 开发工具
支付宝支付-PC电脑网站支付
支付产品全面升级(更新时间:2017/05/05 ),若您使用的是老接口,请移步老版本即时到账文档。
3062 0
|
安全 PHP 开发工具
支付宝支付改版了,你知道吗?
支付宝支付改版了,你知道吗?
247 0
支付宝支付改版了,你知道吗?
你的支付宝小程序接入花呗分期了吗?
三分钟视频带你了解花呗分期。花呗分期是蚂蚁金服推出的消费金融产品,用户在小程序支付时使用花呗分期支付,订单全额实时支付到商家支付宝账户中,用户分期偿还花呗。
2111 12
你的支付宝小程序接入花呗分期了吗?
如何在微信中使用支付宝手机网站支付
目前微信已经拦截了所有在微信内调用支付宝支付的途径,故无法直接唤起支付宝。 但您可以借助点击右上角的通过浏览器打开的方式,来试着打开支付宝。  更多详见“快速接入”部分的微信公众平台无法使用支付宝收付款的解决方案。
831 12
如何签约入驻(电脑网站支付接口)
注册入驻   1.使用支付宝账号入驻开放平台 注册支付宝账号并完成实名认证,如已有支付宝账号请选择下一步入驻流程     如何注册认证支付宝账号【点击查看】     马上注册请点击【现在注册】   2.
932 12
手机网站支付如何实现多账号收款
为了保证商家资金安全,目前暂未开放手机网站支付的多账号收款的功能。即无法用seller_id来指定多个账号来收款。
378 12
分享接入支付宝支付时粗心遇到的两个小问题
首先说一下,支付宝支付时容易出现理解偏差的两个字段 一个是timeout_express另一个是time_expire字段 timeout_express字段可以理解为,用户输入支付密码/或签约支付发起扣费,支付宝开始进行轮询用户可用支付方式的开始(好像支付宝收银台的话,如果用户欠费,会直接给打回来) 说一下,出现问题的两个场景 场景一:使用的是支付宝收银台支付,送的字段是timeout_express,本以为此字段的意思为,后端产生送支付宝表单后过XXmin后给判定为超时的一个设置,就这样送了,没想到后来,接到客诉,用户支付成功,扣款成功,在咱们系统中却返回了失败。