精华内容
下载资源
问答
  • 生成的二维码是一个网页的链接,应用打开网页的时候,是在该应用打开的该网页,网页通过检测打开网页的应用的标识进行分辨,如果是微信支付就跳转的微信的支付接口,如果只支付宝就跳转到支付宝的支付接口
    生成的二维码是一个网页的链接,应用打开网页的时候,是在该应用打开的该网页,网页通过检测打开网页的应用的标识进行分辨,如果是微信支付就跳转的微信的支付接口,如果只支付宝就跳转到支付宝的支付接口
    展开全文
  • 无聊 做一个支付宝打赏二维码

    千次阅读 2018-11-08 20:26:48
    无聊 做一个支付宝打赏二维码

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

    也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                           

    之前csdn 推出了c币 功能,我将兑换了两本书送给了我师弟 ,现在c币作为一种虚拟的的货品,都有支持。
    这里写图片描述
    但兑换的条件币数还是很多。我在想,如何实验将一些流量转化为价值的体验。普遍的方式是制作广告插入,但我实在搞不懂百度和谷歌的的链接是怎样一个方式让这个广告产生价值? 其实很多恶心的网站为了产生这个点击效应会在js 加一个强制的点击,进来的用户,点击了一个按钮,强制观看一个广告。这种操作很让让人恶心,用户体现并不友好。但反而形成一种刷广告的普遍做法。
     很早之前as3 小游戏,在小游戏投入的过程,插入广告,产生一些观看价值。内容优质的话,这个广告观看的人次会形成一种效应。愿意推广形成口碑。不过现在部分民间比较粗暴一点,靠点击和炒作起家。用户输送内容比较低俗一点,关键字填写的方式会偏向一些比较诱惑,煽动词语。有时候一些莫名其妙的图片 和 视频就变成一种炒作人诱导式的接入。这种方式骗取流量很大。可惜一点,对用户而言是不是用户有营养的部分价值?
    现在信息时代的到来,每天信息轰炸,每天创造许多财富,看到这些总会让人产生浮躁不安。挣个钱容易吗?一些人说成功可以复制,但我想复制的只是一些思维方式,实际上,每家公司的文化基因决定了这个互联网的呈现出什么样子。你要改变,除非你先改造你的基因。
        抱着一种玩代码心情,我发现了支付宝有一个二维码扫码付款的制作,打开连接。https://fama.alipay.com/qrcode/qrcodelist.htm,通过扫码进入编辑器界面,填写相关的名称就可以实现到一个二维码的打赏功能。(微信那个还没尝试)
    制作完成后,可以在博客和一些个人网站公众号粘贴一下。但我一直好奇想这个跳转和扫描之后背后做了什么事?** 跳转安全页?还是有识别用户的身份?一些于隐私方面体验,我还不得不对这个二维码产生一些不好的想法。可是相比过往通过网银的方式支付,支付宝和微信的支付接入确实是比过往都要便利,快捷。但有一点不好的地方是,我身边的人对安全支付还存在一些想法,这个安全吗?老一辈并不会使用这些,包括父母一样。手机也是很多功能都不会用,对他们来讲,接受这些早已无能为力。
          我把这个二维码导出来上传进来,写上一句诱惑标语。支付过程千万不要打赏进来,千万不要打赏过来。这样的诱导性关键字,你学会了吗?看似有点幼稚无聊,引用一句网络语言。世界属于三体,消灭人类暴行。 我将这个二维码放在朋友圈那里会怎样?微信并不会扫描出来并调用起支付宝。因为两个支付体系在打架,对消费者而言,不一定是坏事。技术层面上,这种发起调用的功能,技术并没有存在技术难题,只是鉴于商业的性质导致整个发起调用的功能不起效。

    前段时间 搞微信支付,遇到不少坑。互联网支付这块,电子钱包,其实正影响了我们的生活。一台手机作为一个载体承载了太多期盼了。随着的生物技术的加入,扫脸,指纹,未来不用带钱出去也可以尽情地消费,这种技术带来的便利早已来到我们身边。

               

    给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

    这里写图片描述
    展开全文
  • Java支付宝电脑网站支付

    千次阅读 2018-06-23 22:01:27
    支付宝支付的官网文档较为详尽,动手前仔细阅读官方文档可让你少走弯路。本文主要讲的是支付宝电脑网站支付,至于其它的支付宝支付,如app支付,H5支付等大同小异,明白一个其它接口自然不难理解。

    更多最新文章欢迎大家访问我的个人博客😄:豆腐别馆

    一、准备工作

    1. 创建应用
    2. 配置密钥
    3. 搭建和配置开发环境

    ↓ 戳官网文档有详尽介绍
    支付宝开放平台文档中心-电脑网站支付

    总的来说,需要提前准备好的参数有:

    package com.yby.api.ali.pay;
    
    /**
     * 支付宝支付相关配置
     * 
     * @author lwx
     */
    public class AlipayConfig {
    
    	/**
    	 * 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
    	 */
    	public static final String APP_ID = "************";
    
    	/**
    	 * 商户私钥,您的PKCS8格式RSA2私钥
    	 */
    	public static final String MERCHANT_PRIVATE_KEY = "************";
    
    	/**
    	 * 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
    	 */
    	public static final String ALIPAY_PUBLIC_KEY = "************";
    
    	/**
    	 * 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    	 */
    	public static final String NOTIFY_URL = "http://************/notify";
    	
    	/**
    	 * 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    	 */
    	public static final String RETURN_URL = "http://************/return";
    
    	/**
    	 * 签名方式
    	 */
    	public static final String SIGN_TYPE = "RSA2";
    
    	/**
    	 * 字符编码格式
    	 */
    	public static final String CHARSET = "utf-8";
    
    	/**
    	 * 支付宝网关 - 正式环境
    	 */
    	// public static String gatewayUrl = "https://openapi.alipay.com/gateway.do";
    	
    	/**
    	 * 支付宝网关 - 沙箱环境
    	 */
    	public static final String GATEWAY_URL = "https://openapi.alipaydev.com/gateway.do";
    
    	/**
    	 * 日志存放路径
    	 */
    	public static final String LOG_PATH = "D:\\181-duanzu\\alipay\\";
    }
    

    二、接入代码

    注:以下代码只展示支付宝调用相关代码,业务代码不展示,需根据各自需求开发。

    • maven依赖:
    <!-- 蚂蚁金服(支付宝) -->
    <!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
    <dependency>
        <groupId>com.alipay.sdk</groupId>
        <artifactId>alipay-sdk-java</artifactId>
        <version>3.0.0</version>
    </dependency>
    

    1. 异步通知(NOTIFY_URL)与同步通知(RETURN_URL):在调用电脑支付接口前都绕不开这两个通知页,首先需要捋清楚这两个通知分别是干嘛的,能做怎样的事

    • NOTIFY_URL:

    服务器后台通知。这个页面只在后台程序异步运行,即买家和卖家都看不到。买家付完款后,支付宝会调用该接口并把反馈信息POST发送至该页面。在这个页面可根据支付宝传递过来的参数进行商户本身的业务操作且需要在页面上打印出一个success给支付宝,如果反馈给支付宝的不是success,支付宝将会继续调用这个页面。代码如下:

    @RequestMapping("notify")
    public void notifyUrl(HttpServletResponse response) throws Exception {
    	// 获取支付宝POST过来反馈信息
    	Map<String, String> params = new HashMap<String, String>();
    	Map<String, String[]> requestParams = request.getParameterMap();
    	// 签名验证
    	boolean sign = aliPayService.verifySign(params, requestParams);
    	response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
    	// 验签成功,执行商户操作
    	if (sign) {
    		/**
    		 * 实际验证过程建议商户务必添加以下校验:
    		 * 1、验证app_id是否为该商户本身。
    		 * 2、需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号
    		 * 3、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额)
    		 * 4、校验通知中的seller_id(或者seller_email)是否为out_trade_no这笔单据的对应的操作方
    		 * (有的时候,一个商户可能有多个seller_id/seller_email)
    		 */
    		 
    		/**
    		 * <pre>
    		 * 交易状态 {
    		 *    TRADE_FINISHED:通知触发条件是商户签约的产品不支持退款功能的前提下,买家付款成功;
    		 *    或者,商户签约的产品支持退款功能的前提下,交易已经成功并且已经超过可退款期限。
    		 * 
    		 *    TRADE_SUCCESS:通知触发条件是商户签约的产品支持退款功能的前提下,买家付款成功;
    		 * }
    		 * </pre>
    		 */
    		if ("TRADE_FINISHED".equals(trade_status) || "TRADE_SUCCESS".equals(trade_status)) {
    			// 执行商户操作
    			orderService.signSuccess(params, false, ClientUtil.getClientIP(request), user);
    		} else {
    			// 如果返回不是支付成功,将进行订单查询支付结果查询,当结果为支付成功时,重新执行商户操作
    			orderService.tradeQuery(out_trade_no, ClientUtil.getClientIP(request), user);
    		}
    		response.getWriter().write("success");
    
    	} else {
    		response.getWriter().write("fail");
    		// 调试用,写文本函数记录程序运行情况是否正常
    		String sWord = AlipaySignature.getSignCheckContentV1(params);
    		AlipayFunction.logResult(sWord);
    	}
    	
    	response.getWriter().flush();
    	response.getWriter().close();
    }
    
    • RETURN_URL:

    买家付款成功后,如果接口中指定有return_url,买家付完款后会跳到return_url所在的页面,这个页面可以展示给客户看,且该页面只有当付款成功时才会跳转。代码如下:

    @RequestMapping("return")
    public void returnUrl(HttpServletResponse response) throws IOException {
    	// 获取支付宝GET过来反馈信息
    	Map<String, String> params = new HashMap<String, String>();
    	Map<String, String[]> requestParams = request.getParameterMap();
    	try {
    		// 签名验证,此处可不验签,因该页面只有当用户付款成功才会跳转,但异步通知页必须进行验签。
    		boolean sign = aliPayService.verifySign(params, requestParams);
    		if (sign) {
    			String orderSn = params.get(AliPayConstant.Param.OUT_TRADE_NO);
    			DzOrder order = orderService.getBySn(orderSn);
    			String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/booking/except?orderIdCard=" + order.getId() + "&status_step=" + order.getStatus();
    			response.sendRedirect(url);
    		}
    	} catch (Exception e) {
    		e.printStackTrace();
    	}
    }
    

    2. 电脑支付各接口调用工具类

    package com.yby.api.ali.pay;
    
    import java.util.Iterator;
    import java.util.Map;
    
    import com.alipay.api.AlipayApiException;
    import com.alipay.api.AlipayClient;
    import com.alipay.api.DefaultAlipayClient;
    import com.alipay.api.domain.AlipayTradeCloseModel;
    import com.alipay.api.internal.util.AlipaySignature;
    import com.alipay.api.internal.util.StringUtils;
    import com.alipay.api.request.AlipayDataDataserviceBillDownloadurlQueryRequest;
    import com.alipay.api.request.AlipayTradeCloseRequest;
    import com.alipay.api.request.AlipayTradeFastpayRefundQueryRequest;
    import com.alipay.api.request.AlipayTradePagePayRequest;
    import com.alipay.api.request.AlipayTradeQueryRequest;
    import com.alipay.api.request.AlipayTradeRefundRequest;
    import com.alipay.api.response.AlipayDataDataserviceBillDownloadurlQueryResponse;
    import com.alipay.api.response.AlipayTradeCloseResponse;
    import com.alipay.api.response.AlipayTradeFastpayRefundQueryResponse;
    import com.alipay.api.response.AlipayTradePagePayResponse;
    import com.alipay.api.response.AlipayTradeQueryResponse;
    import com.alipay.api.response.AlipayTradeRefundResponse;
    
    /**
     * 支付宝支付工具类
     * 
     * @author lwx
     */
    public class AliPayUtil {
    
    	// 获得初始化的AlipayClient
    	public static AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.GATEWAY_URL, AlipayConfig.APP_ID,
    			AlipayConfig.MERCHANT_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,
    			AlipayConfig.SIGN_TYPE);
    
    	/**
    	 * 电脑网站支付接口 - 简单参数(PC场景下单并支付,可传递的其它非必要参数可查阅官方文档)
    	 * 
    	 * @api alipay.trade.page.pay
    	 * 
    	 * @param out_trade_no
    	 *            商户订单号,商户网站订单系统中唯一订单号,必填
    	 * @param subject
    	 *            订单名称,必填
    	 * @param total_amount
    	 *            付款金额,必填
    	 * @param body
    	 *            商品描述,可空
    	 * @param timeout_express
    	 *            该笔订单允许的最晚付款时间,逾期将关闭交易,该参数在请求到支付宝时开始计时。
    	 *            取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。
    	 *            该参数数值不接受小数点, 如 1.5h,可转换为 90m。
    	 * @param passback_params
    	 *            公用回传参数,如果请求时传递了该参数,则返回给商户时会回传该参数。支付宝只会在异步通知时将该参数原样返回。本参数必须进行UrlEncode之后才可以发送给支付宝,
    	 *            如:merchantBizType%3d3C%26merchantBizNo%3d2016010101111
    	 */
    	public static AlipayTradePagePayResponse simpleParamPagePay(String out_trade_no, String subject,
    			String total_amount, String body, String timeout_express, String passback_params) {
    
    		// 设置请求参数,请求参数可查阅【电脑网站支付的API文档-alipay.trade.page.pay-请求参数】章节
    		AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
    		// 页面跳转同步通知页面路径
    		alipayRequest.setReturnUrl(AlipayConfig.RETURN_URL);
    		// 服务器异步通知页面路径,在公共参数中设置回跳和通知地址
    		alipayRequest.setNotifyUrl(AlipayConfig.NOTIFY_URL);
    
    		// 填充业务参数
    		alipayRequest.setBizContent("{" + "\"out_trade_no\":\"" + out_trade_no + "\"," + "\"total_amount\":\""
    				+ total_amount + "\"," + "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body + "\","
    				+ "\"timeout_express\":\"" + timeout_express + "\"," + "\"passback_params\":\"" + passback_params
    				+ "\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
    
    		AlipayTradePagePayResponse response = null;
    		try {
    			// 调用SDK生成表单
    			response = alipayClient.pageExecute(alipayRequest);
    		} catch (AlipayApiException e) {
    			e.printStackTrace();
    		}
    		if (response == null) {
    			response = new AlipayTradePagePayResponse();
    		}
    		return response;
    	}
    
    	/**
    	 * 统一收单线下交易查询
    	 * 
    	 * @api alipay.trade.query
    	 * @param out_trade_no
    	 *            商户订单号,商户网站订单系统中唯一订单号(与支付宝交易号二选一设置)
    	 * @param trade_no
    	 *            支付宝交易号(与商户订单号二选一设置) out_trade_no、trade_no如果同时存在优先取trade_no
    	 */
    	public static AlipayTradeQueryResponse tradeQuery(String out_trade_no, String trade_no) {
    
    		AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
    
    		if (!StringUtils.isEmpty(trade_no)) {
    			request.setBizContent(
    					"{" + "\"out_trade_no\":\"" + out_trade_no + "\"," + "\"trade_no\":\"" + trade_no + "\"" + "  }");
    		} else if (!StringUtils.isEmpty(out_trade_no)) {
    			request.setBizContent("{" + "\"out_trade_no\":\"" + out_trade_no + "\"," + "\"trade_no\":\"\"" + "  }");
    		}
    
    		AlipayTradeQueryResponse response = null;
    
    		try {
    			response = alipayClient.execute(request);
    		} catch (AlipayApiException e) {
    			e.printStackTrace();
    		}
    		if (response == null) {
    			response = new AlipayTradeQueryResponse();
    		}
    		return response;
    	}
    
    	/**
    	 * 统一收单交易退款接口
    	 * 
    	 * @api alipay.trade.refund
    	 * 
    	 * @param out_trade_no
    	 *            商户订单号,商户网站订单系统中唯一订单号(请二选一设置:out_trade_no/trade_no)
    	 * @param trade_no
    	 *            支付宝交易号(请二选一设置:out_trade_no/trade_no)
    	 *            out_trade_no、trade_no如果同时存在优先取trade_no
    	 * @param refund_amount
    	 *            需要退款的金额,该金额不能大于订单金额,必填
    	 * @param refund_reason
    	 *            退款的原因说明
    	 * @param out_request_no
    	 *            标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传
    	 */
    	public static AlipayTradeRefundResponse refund(String out_trade_no, String trade_no, String refund_amount,
    			String refund_reason, String out_request_no) {
    		// 设置请求参数
    		AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();
    
    		alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"trade_no\":\"" + trade_no + "\","
    				+ "\"refund_amount\":\"" + refund_amount + "\"," + "\"refund_reason\":\"" + refund_reason + "\","
    				+ "\"out_request_no\":\"" + out_request_no + "\"}");
    
    		AlipayTradeRefundResponse response = null;
    		try {
    			response = alipayClient.execute(alipayRequest);
    		} catch (AlipayApiException e) {
    			e.printStackTrace();
    		}
    		if (response == null) {
    			response = new AlipayTradeRefundResponse();
    		}
    		return response;
    	}
    
    	/**
    	 * 统一收单交易退款查询接口
    	 * 
    	 * @api alipay.trade.fastpay.refund.query
    	 * 
    	 * @param out_trade_no
    	 *            商户订单号,商户网站订单系统中唯一订单号(请二选一设置:out_trade_no/trade_no)
    	 * @param trade_no
    	 *            支付宝交易号(请二选一设置:out_trade_no/trade_no)
    	 *            out_trade_no、trade_no如果同时存在优先取trade_no
    	 * @param out_request_no
    	 *            请求退款接口时,传入的退款请求号,如果在退款请求时未传入,则该值为创建交易时的外部交易号,必填
    	 */
    	public static AlipayTradeFastpayRefundQueryResponse refundQuery(String out_trade_no, String trade_no,
    			String out_request_no) {
    
    		AlipayTradeFastpayRefundQueryRequest alipayRequest = new AlipayTradeFastpayRefundQueryRequest();
    		if (!StringUtils.isEmpty(trade_no)) {
    			alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"trade_no\":\"" + trade_no
    					+ "\"," + "\"out_request_no\":\"" + out_request_no + "\"}");
    		} else if (!StringUtils.isEmpty(out_trade_no)) {
    			alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"trade_no\":\"\","
    					+ "\"out_request_no\":\"" + out_request_no + "\"}");
    		}
    
    		AlipayTradeFastpayRefundQueryResponse response = null;
    		try {
    			response = alipayClient.execute(alipayRequest);
    		} catch (AlipayApiException e) {
    			e.printStackTrace();
    		}
    		if (response == null) {
    			response = new AlipayTradeFastpayRefundQueryResponse();
    		}
    		return response;
    	}
    
    	/**
    	 * 统一收单交易关闭接口
    	 * 
    	 * @api alipay.trade.close
    	 * @param out_trade_no
    	 *            商户订单号,商户网站订单系统中唯一订单号(请二选一设置:out_trade_no/trade_no)
    	 * @param trade_no
    	 *            支付宝交易号(请二选一设置:out_trade_no/trade_no)
    	 *            out_trade_no、trade_no如果同时存在优先取trade_no
    	 */
    	public static AlipayTradeCloseResponse close(String out_trade_no, String trade_no) {
    		AlipayTradeCloseRequest alipay_request = new AlipayTradeCloseRequest();
    		AlipayTradeCloseModel model = new AlipayTradeCloseModel();
    		model.setOutTradeNo(out_trade_no);
    		model.setTradeNo(trade_no);
    		alipay_request.setBizModel(model);
    
    		AlipayTradeCloseResponse response = null;
    		try {
    			response = alipayClient.execute(alipay_request);
    		} catch (AlipayApiException e) {
    			e.printStackTrace();
    		}
    		if (response == null) {
    			response = new AlipayTradeCloseResponse();
    		}
    		return response;
    	}
    
    	/**
    	 * 验签签名
    	 * 
    	 * @param params
    	 *            参数集
    	 * @param requestParams
    	 *            支付宝GET过来的反馈信息
    	 * @return
    	 */
    	public static boolean verifySign(Map<String, String> params, Map<String, String[]> requestParams) {
    
    		for (Iterator<String> 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] + ",";
    			}
    			// 乱码解决,这段代码在出现乱码时使用
    			/*
    			 * try { valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); }
    			 * catch (UnsupportedEncodingException e) { e.printStackTrace(); }
    			 */
    
    			params.put(name, valueStr);
    		}
    
    		boolean signVerified = false;
    		try {
    			// 调用SDK验证签名
    			signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET,
    					AlipayConfig.SIGN_TYPE);
    		} catch (AlipayApiException e) {
    			e.printStackTrace();
    		}
    
    		return signVerified;
    	}
    }
    

    3. 支付宝相关工具类

    package com.yby.api.ali.pay;
    
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * 类名:AlipayFunction
     * 功能:支付宝接口公用函数类
     * 详细:该类是请求、通知返回两个文件所调用的公用函数核心处理文件,不需要修改
     */
    public class AlipayFunction {
    
    	/**
    	 * 除去数组中的空值和签名参数
    	 * 
    	 * @param sArray
    	 *            签名参数组
    	 * @return 去掉空值与签名参数后的新签名参数组
    	 */
    	public static Map<String, String> paraFilter(Map<String, String> sArray) {
    
    		Map<String, String> result = new HashMap<String, String>();
    		if (sArray == null || sArray.size() <= 0) {
    			return result;
    		}
    
    		for (String key : sArray.keySet()) {
    			String value = sArray.get(key);
    			if (value == null || value.equals("") || key.equalsIgnoreCase("sign") || key.equalsIgnoreCase("sign_type")) {
    				continue;
    			}
    			result.put(key, value);
    		}
    
    		return result;
    	}
    
    	/**
    	 * 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串
    	 * 
    	 * @param params
    	 *            需要排序并参与字符拼接的参数组
    	 * @return 拼接后字符串
    	 */
    	public static String createLinkString(Map<String, String> params) {
    
    		List<String> keys = new ArrayList<String>(params.keySet());
    		Collections.sort(keys);
    		String prestr = "";
    		
    		for (int i = 0; i < keys.size(); i++) {
    			String key = keys.get(i);
    			String value = params.get(key);
    
    			// 拼接时,不包括最后一个&字符
    			if (i == keys.size() - 1) {
    				prestr = prestr + key + "=" + value;
    			} else {
    				prestr = prestr + key + "=" + value + "&";
    			}
    		}
    
    		return prestr;
    	}
    	
    	/**
    	 * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
    	 * 
    	 * @param sWord
    	 *            要写入日志里的文本内容
    	 */
    	public static void logResult(String sWord) {
    		FileWriter writer = null;
    		try {
    			writer = new FileWriter(AlipayConfig.LOG_PATH + "alipay_log_" + System.currentTimeMillis() + ".txt");
    			writer.write(sWord);
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			if (writer != null) {
    				try {
    					writer.close();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    }
    

    三、接口逻辑说明

    首先给出支付宝官方文档所提供的接口流程图,建议新手先花时间看明白,别急着调接口。
    官网提供的接口流程
    官网提供的接口流程
    简言之,就商户系统(即我们自己开发的后台)而言,其流程大致就是(emmm,画得粗略显得更复杂了()):
    这里写图片描述

    四、统一收单交易关闭接口(alipay.trade.close)注意事项

    该接口的调用只在支付宝成功创建订单后才可调用正常。说这个什么意思呢,主要是防止出现以下场景:
    用户正常下单,正常去到二维码支付页,此时商户在用户不知情的情况下在后台执行了取消订单操作(商户后台取消待支付订单的同时应调用支付宝取消订单接口),接着用户依旧进行支付操作,那么将出现以下两种情形:

    1. 商户取消订单前用户已扫码,支付宝生成订单,交易关闭接口正常关闭订单,用户无法支付。
    2. 商户取消订单前用户未扫码,支付宝未生成订单,交易关闭接口关闭订单异常,用户支付成功。

    第一种情形倒没什么问题,如若是第二种,即商户的订单已是取消状态,但用户却付款成功,此时如无特殊需求,直接让该订单走入退款流程即可。


    ps:

    1. 支付宝支付的官网文档较为详尽,看着文档基本不会出现什么问题,主要是要注意商户自身业务逻辑的处理。
    2. 其它支付宝支付,如app支付,H5支付等大同小异,明白一个其它接口自然不难理解。
    3. 如有不当之处欢迎提出,喷子请圆润地离开。

    下一篇博客将带来微信扫码支付。

    展开全文
  • 前面分享了一篇 JAVA后端调用微信支付“统一下单”接口实现微信二维码扫码支付 的博客,虽然二维码在生成的时候可以设置有效期,但是这依旧... 场景一:张三在你的网购平台下了一个订单,起初是选择微信二维码扫码支...

           前面分享了一篇 JAVA后端调用微信支付“统一下单”接口实现微信二维码扫码支付 的博客,虽然二维码在生成的时候可以设置有效期,但是这依旧不能保证整个业务流程和数据的安全。因为通常网站提供给用户的支付方式不止一种,除了微信支付,可能还有支付宝和银联支付等。

           我们不妨先来假设下面几个场景:

           场景一:张三在你的网购平台下了一个订单,起初是选择微信二维码扫码支付的,但是打开微信时发信微信零钱余额不足,于是张三就把这个二维码截图发给自己的基友李四,等了五分钟,李四可能因为手头有事要忙迟迟没有支付,这时张三实在没耐心了,就想起自己的支付包刚好还有点钱,于是就用支付宝支付成功了。恰巧此时李四那边也忙完自己的事情了,拿着自己的微信也成功扫码支付了。这是就造成一个订单,被成功支付两次了。

           场景二:张三在你的网购平台下了一个订单,选择微信二维码扫码支付,因自己余额不足,将生成的二维码发给李四,由李四代付,大约过了五分钟,李四那边有事忙着一直没有支付,此时张三突然不想买了,于是取消了订单,过了几分钟才想起来要通知李四取消订单,恰好此时李四那边已经成功扫码支付了。这就造成已取消订单被支付成功的情况。


            针对这种一个订单被多次支付和已取消订单被支付的情况,平台需要提供退款的功能,并且添加流水的操作应该由定时任务来执行,具体的流程准备另写一篇博客说明(如果我还记着这回事的话)。但是这就足够了吗?所谓种什么因得什么果,为什么不从源头上降低上面这两种情况发生的概率呢!假设订单取消后的30秒内,生成的微信二维码依旧有效,如果这还勉强能够说得过去的话,那么用户订单取消5分钟后(甚至更长时间),这个二维码还能被正常使用,那这就说不太过去了吧。你可能会说,可以在生成二维码的时候设置二维码的有效时间是5分钟或者更短(这个可参考 微信支付接口调用之二维码失效时间的设置),但是你总会遇到一些需求,比如要求二维码的有效时间跟着平台订单的有效时间走的情况,这时二维码的有效时间就不只10分钟了吧。

          针对这种情况,我的解决方案是:新建一张表 t_qr_code,用来存储生成的二维码图片路径,并且保存二维码的失效时间。表的结构如下:

    CREATE TABLE `t_qr_code` (
      `pk_id` varchar(50) NOT NULL COMMENT '主键',
      `order_id` varchar(50) DEFAULT NULL COMMENT '商户订单号',
      `code_url` varchar(255) DEFAULT NULL COMMENT '二维码保存的路径',
      `status` tinyint(3) DEFAULT '1' COMMENT '二维码状态,1,正常;2,已调用微信api使之失效;3,需要调用微信api关闭订单;',
      `expire` datetime DEFAULT NULL COMMENT '二维码失效日期',
      `create_date` datetime DEFAULT NULL COMMENT '二维码生成时间',
      `update_date` datetime DEFAULT NULL COMMENT '本记录更新时间',
      PRIMARY KEY (`pk_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

     

    该表有以下几个用处:
    (1)当用户关闭二维码所在页面,下次再次对这个订单发起微信二维码扫码支付时,如果这时二维码有效期超过15秒,就依旧返回这个二维码图片和失效时间,而不会重新跟微信请求。当然这个也需要前端根据这个二维码的失效时间做一些特效处理以提高用户体验,比如二维码失效了,就弹出一个按钮让用户点击刷新。
    (2)当用户取消订单的时候,查询 t_qr_code 表中是否有未是失效的二维码,如果有,修改status=3,由定时任务调用微信关闭订单接口的接口。
    (3)如果用户一开始选择二维码扫码支付,成功生成了二维码,但是最终却是选择其他方式支付成功的,其它方式的支付接口中,需要执行下面这台sql语句:

    update t_qr_code set status=3 where expire&gt;now() and status=1 where order_id=#{orderId}

          大致思路大概就如此,顺便提醒一下,你的调用微信“关闭订单”接口的定时任务的扫描间隔时间应该设置的尽量短一些,这个时间越短,造成失效订单被支付的概率就越低。在分享源码之前,请参考官方文档  ,值得注意的是,微信H5支付,微信JSAPI支付,微信Native支付(即二维码扫码支付)和微信APP支付 的关闭订单接口都是同一个。感兴趣的可以去  微信支付  官网逐一查看。此接口本人亲测有效,测试方法:当微信生成二维码的时候,设置的二维码有效期是30分钟,但是在生成二维码3-5分钟后,调用下面这个关闭订单的接口,等再次拿微信扫描二维码的时候,微信提示该订单已失效。官方文档提示要再二维码生成的5分钟后再调用关闭订单的接口,但是实际测试发现3分钟后也能成功取消。

           下面分享具体的实现代码,我把他封装到了一个工具类中,返回的参数都在map中,如果想知道有哪些参数,可以在自己的控制台打印一下或者参考官方文档 ,下面分享代码:

    package wxpay;
    
    
    import java.util.Map;
    import java.util.SortedMap;
    import java.util.TreeMap;
    
    
    public class WxApiUtils {
    
        /**
         * 关闭微信订单接口
         * @param orderId你自己网站生成的订单号,注意要和你申请二维码时候用的订单号一致,
                看过我前面那边申请二维码支付的朋友会发现,此时我的这个orderId应该是要带有
                支付标识的,如果我网站的订单号是:123456 ,那么此时的这个参数
                 orderId=123456_NAVTIVE ,因为我申请二维码用的就是这个带标识的订单后
         * @return
         */
        public static Map<String, String> closeOrder(String orderId){
    
            String appid =Constant.APP_ID;
            String mch_id = Constant.MCH_ID;
            String out_trade_no = orderId;
            String nonce_str = WXUtil.createNoncestr().substring(1, 32);
    
            SortedMap<String, String> packageParams = new TreeMap<String, String>();
            packageParams.put("appid", appid);
            packageParams.put("mch_id", mch_id);
            packageParams.put("out_trade_no", out_trade_no);
            packageParams.put("nonce_str", nonce_str);
    
            String sign = WXUtil.createSign(packageParams);
    
            packageParams.put("sign", sign);
    
            String xml =WXUtil.ArrayToXml(packageParams);
            logger.info("map转换成xml的结果:"+xml);
    
            String createOrderURL = "https://api.mch.weixin.qq.com/pay/closeorder";
    
            return GetWxOrderno.getReturnUrl(createOrderURL, xml);
    
        }
    
    
    }
    

     

    涉及到的所有工具类和实体类,以及一些依赖的jar包,在我的另一篇博客 JAVA后端调用微信支付“统一下单”接口实现微信二维码扫码支付 中都能找到,时间有限,此处不再上传。

    至此,分享结束,希望对各位有帮助。

    展开全文
  • java对接支付宝支付(手机网站支付)

    千次阅读 2019-01-03 21:55:03
    记录一下对接支付宝支付的过程,既是对这段时间工作的总结,也希望能对之后需要对接支付宝手机网站支付的小伙伴一点帮助. 1、查看官方文档,具体对接流程(https://docs.open.alipay.com/203/)。 2、下载官方demo,...
  • 方式一 判断应用类型相应跳转微信和支付宝融合到一张二维码上是可以实现的,这个二维码就是一个地址链接url实际上是一个支付网页(我们自己网站的页面),支付宝和微信的扫一扫实际上就是在应用内部打开的这个网页。...
  • 学习JavaWeb后一个网上书城完整项目

    万次阅读 多人点赞 2019-08-29 18:17:16
    网上书城系统使用Eclipse JavaEE开发,数据库为mysql5.5,服务器为tomcat8.5。本系统包含九模块,前台模块分为:用户模快,分类模块,图书模块,购物车模块,订单模块;后台模块分为:管理员模块,分类管理模...
  • 支付宝手机网站支付详细流程步骤

    千次阅读 2020-11-02 17:00:49
    手机网站支付开发流程步骤 :正式环境 需满足的条件: 看着截图上的条件很苛刻,其实没有那么严格,只要是公司账号,有营业执照即可,支付宝账号名称和你们公司那个名一样就可以了(一般申请支付宝账号时,...
  • 支付宝-电脑网站支付并跳转页面

    千次阅读 2019-03-12 16:32:18
    支付API官方文档 alipay.trade.page.pay(统一收单下单并支付页面接口) 先创建应用 调用下单支付接口 调用该API时按照文档传入相应参数 公共请求参数相当于支付宝帮我们写好了,就是我们创建应用时的一些数据 这里的...
  • 首先来分类一下常见的支付宝支付情况: 常见的类型: 商户出示付款码,用户通过扫描付款码进入支付宝支付界面,输入付款金额,支付成功。常见一般门店。 -----该方式不需要开发,商户注册商家付款码即可。(此处有...
  • 微信公众号支付需要携带用户的openid,因此在下单付款时需要先获取到用户的openid...从公众号开发文档不难知道网页授权回调域名只能填写一个顶级域名,那么随之而来的问题便是多个域名如果要用同一个微信支付接口怎么办
  • 如果在正常的form表单中唤醒不了支付宝app只能用网页进行支付请参考如下: 商家在网页中调用支付宝提供的网页支付接口调起支付宝...若接入的是新版本手机网站支付接口(alipay.trade.wap.pay),用户在安装支付宝...
  • iOS 支付宝手机网站支付

    千次阅读 2018-01-04 19:52:04
    后台提供的是一个可以使用webView加载的URL, URL的返回值为一个带有订单信息的from表单, 只有是这种类型,才能沿用以下代码 如果你请求的网络接口, 返回值中直接包含订单信息串, 那么可用直接传orderInfo的方法直接来...
  • 现有一个支付方案推荐给大家。无需身份证、无需微信账号密码、无资金中转,只要有一台电脑,即时实现个人支付功能!因为无需任何资质,也无需资金中转直接到你的微信账号,所有安全可靠!因为以面对面付款,实现支付...
  • 申请一个沙箱环境 生成签名,并在沙箱环境中设置好签名 设置应用公钥 支付宝密钥生成器 下载链接 https://opendocs.alipay.com/open/291/105971 下载完后 并将密钥复制到,然后保存设置即可 私钥保留,公钥设置...
  • 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email) 4、验证app_id是否为该商户本身。 */ if($result) {//验证成功 /...
  • 我是昨天晚上洗完澡之后,大概八九点,才开始正式开工尝试去这工程的,我去支付宝的蚂蚁金服开放平台里把各个知识点和文档大概都看了遍,大致弄明白了要怎么操作了,建议大家看看电脑网站开发文档,忙到了夜里...
  • 个人网站怎么申请支付接口?

    万次阅读 2018-03-04 09:29:29
    现有一个支付方案推荐给大家。无需身份证、无需微信账号密码、无资金中转,只要有一台电脑,即时实现个人支付功能!因为无需任何资质,也无需资金中转直接到你的微信账号,所有安全可靠!因为以面对面付款,实现支付...
  • Java之支付宝支付(电脑网站支付)案例实战

    千次阅读 多人点赞 2018-09-30 11:34:43
    摘要:最近的一个项目中涉及到了支付业务,其中用到了微信支付和支付宝支付,在的过程中也遇到些问题,正好马上放假了,公司不忙了,所以现在总结梳理一下,分享给有需要的人,也为自己以后回顾留个思路。...
  • php支付宝开发之pc网站支付接入

    万次阅读 2017-11-10 11:29:50
    所以只能选php支付了,不过我们在做支付的时候,从官网下载一个demo,然后到蚂蚁金服上面申请个开发账号,配置本地的demo即可。具体的申请详见:点击打开链接 我用的支付demo也已经上传到我的个人主页:点击打开...
  • 移动应用 ”,然后创建一个应用。此时该应用的状态为开发中,需要我们添加一些功能和信息后去审核,审核通过就成了已上线。就可以开始使用了。 这里我们只需要两项功能:1、手机网站支付;2、用户信息授权 除此之外...
  • 这就要求我们对微信和支付宝做一个聚合,在平台内做一个客户端判断。 2 支付选型 支付宝我们选用的是手机网页支付 微信用的是native支付 3 准备 新建一个工程,结构如下所示 主要用到的技术有springboot+spring...
  • web端网站接入支付宝支付过程

    千次阅读 2020-02-22 17:08:31
    1、在支付宝开放平台... 找到页或者移动应用列表 你可以看到你已申请的应用 点击进入应用详情增加功能: 2、在自己的javaweb应用里引入对应的jar包 <!--阿里支付SDK--> <dependency> <group...
  • vue 移动端H5微信支付和支付宝支付

    万次阅读 多人点赞 2019-05-23 16:35:44
    支付宝支付 [手机网站支付转 APP 支付 官方API ] 订单生成逻辑:前端请求后端提交订单,后端去和微信或者支付宝对接生成订单(后续支付都是这逻辑进行的对接) 、移动端微信支付,vue中如何玩? 在移动端微信...
  • 直接上一个网站吧,反正现在开发都是...扫描这个二维码,微信支付会跳转到一个h5界面,上边还有一个二维码是财付通的,识别就可以跳转到微信支付了 支付宝支付,扫描就直接可以跳转到支付宝支付了 原理呢,是这样...
  • 支付之码支付

    千次阅读 2019-01-24 16:40:12
    四方支付之码支付   在app及web网站支付环节肯定是少不了的!我来介绍一款名为 “码支付”的平台, 我先来简单介绍一下此平台,经过一...供用户使用,也就相当于作为了一个跳板,他中间蕴含着平常接入支付...
  • 手机网站支付转Native支付--Android

    千次阅读 2017-04-02 14:24:32
    背景为了节约开发成本,很多Native-H5混合App采用手机...简介手机网站支付转Native支付是支付宝标准版SDK内置的项功能,能够帮助Native-H5混合App以极低的接入成本极大地提升支付成功率。手机网站支付PK手机网站转N
  • 支付宝或微信生成的二维码中本质都内嵌了一个url,在扫码时实际是定向去访问二维码中内嵌的url,这样我就可以将这个url指定到我的一个控制器,在控制器中判断是微信还是支付宝软件扫的,然后去唤醒各自的支付即可。...
  • 微信H5支付:名词解释:就是在自己的H5网站页面里调用微信支付功能调用微信H5支付接口前提条件:1,注册公众号并且通过认证2,在公众号里申请微信支付,成为商户号3,在商户平台里申请H5支付以上3条件都满足时,便可以调用...
  • 、场景:公司需要在网站上进行支付宝支付。 二、API:使用支付宝开放平台的支付能力-即时到账接口。支付宝开放平台链接 三、分析: 1、支付宝的文档比较容易看,主要是有相应的DEMO,我这里看的DEMO是 JAVA-UTF-8...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 78,858
精华内容 31,543
关键字:

做一个可以支付的网站