基于JAVA --第三方支付的讲解(支付宝) MR.凌波漫步9527(原创)

我们首先要去官网下Demo,以及对应版本的SDK 以及RSA2的一个加密工具

下载地址:
SDK: https://docs.open.alipay.com/54/cyz7do/
RSA加密工具: https://docs.open.alipay.com/291/105971/
SDK 的连接里面 有项目的DEMO 以及SDK jar包
本次我们解决的问题有
1.如何完成第三方支付(PC网页版)
2.在支付过程中如何保证订单唯一性
3.如何防止重复订单的出现。
4.商户公匙和密匙的作用 以及支付宝公匙是什么?作用是什么?
5.支付宝公匙和商户公匙的区别
6.支付宝如何验证交易成功,在异步通知的时候我们如何根据异步通知去和支付宝对接,从而得知交易订单的真实性。
7.支付宝的验签~ 以及可能造成验签失败的原因


首先创建个项目

把jar包引入项目不必非要按照我这个建,下载好了以后我们找到模板项目,然后再页面的下面找到
这个页面是我们的支付宝支付代码案例 打开代码如下

付款 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ page import="com.alipay.config.*"%> <%@ page import="com.alipay.api.*"%> <%@ page import="com.alipay.api.request.*"%> <% //获得初始化的AlipayClient AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
//设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(AlipayConfig.return_url);
alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

//商户订单号,商户网站订单系统中唯一订单号,必填
String out_trade_no = new String(request.getParameter("WIDout_trade_no").getBytes("ISO-8859-1"),"UTF-8");
//付款金额,必填
String total_amount = new String(request.getParameter("WIDtotal_amount").getBytes("ISO-8859-1"),"UTF-8");
//订单名称,必填
String subject = new String(request.getParameter("WIDsubject").getBytes("ISO-8859-1"),"UTF-8");
//商品描述,可空
String body = new String(request.getParameter("WIDbody").getBytes("ISO-8859-1"),"UTF-8");

alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\"," 
		+ "\"total_amount\":\""+ total_amount +"\"," 
		+ "\"subject\":\""+ subject +"\"," 
		+ "\"body\":\""+ body +"\"," 
		+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

//若想给BizContent增加其他可选请求参数,以增加自定义超时时间参数timeout_express来举例说明
//alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\"," 
//		+ "\"total_amount\":\""+ total_amount +"\"," 
//		+ "\"subject\":\""+ subject +"\"," 
//		+ "\"body\":\""+ body +"\"," 
//		+ "\"timeout_express\":\"10m\"," 
//		+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
//请求参数可查阅【电脑网站支付的API文档-alipay.trade.page.pay-请求参数】章节

//请求
String result = alipayClient.pageExecute(alipayRequest).getBody();

//输出
out.println(result);
复制代码

%>

我们从以上代码中取出在我这个标签<%java%>写java的地方的代码

改写成一个java代码 将是如下

编写 前台点击支付后跳转的javaservlet SSM 项目中可以直接是方法

/**
*

Title: FriendCommentPush.java


*

Copyright: 天津艺文星球 (c) 2018


*

Company: www.tjywxq.com


* @author 凌波漫步
* @date 2018年4月18日
* @version 1.0 * @功能: * @参数: * @效果: */
package cn.wh.pay;

import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Random; import java.util.UUID;

import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;

import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.request.AlipayTradePagePayRequest;

import cn.wh.domain.AliPayConfig; import cn.wh.pay.util.PaydingdanUtils;

/**
*

Title: FriendCommentPush.java


*

Copyright: 凌波漫步 (c) 2018


* * @author 凌波漫步
* @date 2018年4月18日
* @version 1.0 * @功能: * @参数: * @效果: */ @WebServlet("/order/confirm") public class PayService extends HttpServlet{

@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	System.out.println(11);
	//根据提交过来的商品信息 去数据库查询商品详细信息
	String title ="IphoneX";
	Integer count =2;
	Double price =500.00d;
	double total =count*price;
	/*SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
	//时间戳 订单号
	String format = simpleDateFormat.format(Calendar.getInstance().getTime());*/
	//生成一个订单号
	String dingdan = PaydingdanUtils.dingdan();
	
		//配置支付宝网关 以及 app 应用id 配置 私钥  配置传输格式是json 配置 配置字符转换格式 charset  设置公钥 以及加密的类型
	AlipayClient clent=new DefaultAlipayClient(AliPayConfig.gatewayUrl,AliPayConfig.app_id,AliPayConfig.merchant_private_key,"json",AliPayConfig.charset,AliPayConfig.alipay_public_key,AliPayConfig.sign_type);
	//设置请求参数
	AlipayTradePagePayRequest alirequest = new AlipayTradePagePayRequest();
	//在请求参数中设置好给支付宝传递过去的 同步回调地址
	alirequest.setReturnUrl(AliPayConfig.return_url);
	//在请求参数中设置好给支付宝传递过去的 异步回调地址
	alirequest.setNotifyUrl(AliPayConfig.notify_url);
	// 商户订单号						
/*	String out_trade_no = new String(request.getParameter("WIDout_trade_no").getBytes("ISO-8859-1"),"UTF-8");
	//付款金额,必填
	String total_amount = new String(request.getParameter("WIDtotal_amount").getBytes("ISO-8859-1"),"UTF-8");
	//订单名称,必填
	String subject = new String(request.getParameter("WIDsubject").getBytes("ISO-8859-1"),"UTF-8");
	//商品描述,可空
	String body = new String(request.getParameter("WIDbody").getBytes("ISO-8859-1"),"UTF-8");*/
	//在这里把自己的基本信息传入
	String out_trade_no=dingdan;
	
	String total_amount=String.valueOf(total);
	
	String subject=title;
	
	String body="当前订单购买者是编号:"+new Random().nextInt(100);
	String content="{\"out_trade_no\":\""+ out_trade_no +"\"," 
			+ "\"total_amount\":\""+ total_amount +"\"," 
			+ "\"subject\":\""+ subject +"\"," 
			+ "\"body\":\""+ body +"\"," 
			+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}";
	alirequest.setBizContent(content);
	String returnout="";
	try {
		returnout = clent.pageExecute(alirequest).getBody();
	} catch (AlipayApiException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	//returnout是个HTML格式的标签集合 返回给前台用做跳转支付宝的平台连接  

	//把所有要提交的信息全部封装在returnout 中 然后返回给本地一个 form 表单 表单有个hidden hidden中是个json格式的 数据串 然后有个表单自动提交 提交到支付宝网关
	System.out.println(returnout);
	request.setAttribute("message", returnout);
	request.getRequestDispatcher("/pagetopay.jsp").forward(request, response);
	
	
} 
复制代码

}

工具类里面的 APPID 请用沙箱版

商家的公匙 密匙 请用RSA 工具生成 注:点一次生成 生成的是一对 不可以点一次后复制的公匙 然后再点一次 复制 密匙 注意看工具类中要的是 支付宝的公匙 还是 商家的 公匙

然后编写一个 当前支付方法应用的静态变量工具类

/**
*

Title: FriendCommentPush.java


*

Copyright: 天津艺文星球 (c) 2018


*

Company: www.tjywxq.com


* @author 凌波漫步
* @date 2018年4月18日
* @version 1.0 * @功能: * @参数: * @效果: */
package cn.wh.domain;

import java.io.FileWriter; import java.io.IOException;

public class AliPayConfig { public static String app_id = "2016091100488851";

// 商户私钥,您的PKCS8格式RSA2私钥
public static String merchant_private_key = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCN/mS2Ya7S38Zv3S/avyfNZetJYR1mpLGAM6AmxAM46sqCGqXBFpiJRUFml7/foxhdstKNr2LfyOD780jBXIARMsbvj9jm6DNgB98DK0QZlonAX6DKU1IbdgdipSqAxydtls6dcYJktqZppCfqz5DA4wLoaFCx7UdZQ8TZozG25DRAVLJM26Pqwr7pMC/tMiIDrLomC+WArCyTW/5OIxs0BrKWooqWD14f94I6USJVswPrf07mWmtB2oCs8dfpqZCecOZgvelp1cKyxkqkdon4nnAU7gd4Fe0pu2TzX5SmFUiq6ebJA8pleIEGJHdzscbe6DOiGjKD32z/ry1OeFEXAgMBAAECggEATk9u2+cjs8kWd7tVGR8zpGQBT4bv4BwUiM/wE3EnFcznwrlPkR4VIh+/4gTvHTelyIdG+D0yGpl++3VBOuL4/oMylAyRY0fMjbnJlMXX2QTdE+upkexB7EM773uH5V3wsM/rQ4nGkCTrwnd2TFoNS1Pn1qUxW++w2do2RpFqaaK+Se+B9IkcyKxEBi7uOPFFzYmNH9AN3wlJtHssPW+pgiFhD2z9M7F2FA+BJZLdeTQmBi/V44itPppO1S/2o36n6VM3sXcB+wFwMd9wFM/yGXAcdus/8/AXEuce0qpLqomFtARiczHX7cIK/AESzMMwhYP5DHMm3oTFga6FLmcsAQKBgQDVcqut2hTh+gidKGKbjXeA3Xgvtm8iL+v/+hCeZAFq+NZnp4iXTWKGw+hkJ5Kzih7ev7teJX8eFwcVTTRuO/3pZUKyBDg8Ljjg4wEwmGaLhN47vZ5hKSHGYtX/+8Mdt28L20ZZBxl72chDJV9ieHIGTM8dEE3u0Yw8HA3/TZbBdwKBgQCqTQ1ztFAY9f0+Sya8GFaSpvJIpDcDk6y721P7crd0RRWGiXaPcLAr+VBbAX157cqL4hAfTku2u/Dm5rfGsXxt8B7mBWKFjha9aTbAmp/d+ZJEKB0O6aQuAi104G2sYxw05VNjNQXEEOMtAalwcxqZ3YpPOpCh234cyPhHEefVYQKBgALh4omdeUy36KfepL4/Ac8eroHOb9/BT+mMAe9xoEdGhvatX33TkLILMTcxBZ0hD1uosSoLTZUlcHYMLdoTO1GMiYMH5Y6CfUgkKJ70X+YgbDPYUqwzNv6L1SH4z2C2WmyJkIChROnUPg0SEyCsSbXmEaHt12+TKtag9lttO8zvAoGBAKmeGPnW67gQuWxj+W56Zy+lq8cCF/EuEmsApoLY3TOm4yuemkF/oVgK9yfNMiZQ2t28CQbFOtAEHIo93Wi+ugndkUjUsC4JOUjqFCh9WSEDQ9Uyhs6lkmporNGt/k4mYJ+mkQlMdDO2Bi57a0Gewy3g47LJx+gN72vIFtDiWp/BAoGATIaa2xWnGrMaiLauP9v1SbRDOW0RSqSLYazvyHn6QbyeaXk0Leu/9sn9HUCnnoJZh99JEApxwC5AP7lVCdh/laIyh/lTOC312XIIo9AQp/G1ajpd+m3zv7sG9pDVWZw3kmMdKmTXASr/81LCF6DG5ovIddvE59x2Cs6wPSF7t6E=";

// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public static String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvqbuohyjpxzyGXS3Wupe0GCQ3mxboDTIEhlFocnIhN4GPYePEA+CsgVsN8K4IE1sH0LOqPNRmkuSWvS4orBlP6PfYlCci2qo27zU2V5HTiFmr8nBBATbI1qt7QErrWl90/lPvn2jdFFI2NxsjF+gQinR15Y5vTZGOhHzTJaPd7R3uf4uHv8ezNFK/3vDNBtQrK8NUQrCDnkkfYh97lfqiuJwhRMDaY+h3Vx8IxF9cEE1muokPxu0f6X/LPCjeJI4rfTTCSy953RNnYnY6lOkOMX1fGm2Tle7M/WRThjH3ehjoJrb69AzPH4turNTLnT50cFh+/GXHeRyfNyc0PNIxwIDAQAB";

// 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "http://a207665u90.51mypc.cn:53274/alipay_Demo/notify";

// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String return_url = "http://a207665u90.51mypc.cn:53274/alipay_Demo/success";

// 签名方式
public static String sign_type = "RSA2";

// 字符编码格式
public static String charset = "utf-8";

// 支付宝网关
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";

// 支付宝网关
public static String log_path = "C:\\";
复制代码

//此处省列一切 SET GET 方法 有参 无参 等..

//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

/** 
 * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
 * @param sWord 要写入日志里的文本内容
 */
public static void logResult(String sWord) {
    FileWriter writer = null;
    try {
        writer = new FileWriter(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();
            }
        }
    }
}
复制代码

}

最后注意的问题一定注意 同步异步通知 一定要设置成公网可以访问的项目 不能是本机域名 或者是内网域名 有需要的 可以去 用花生壳(收费) nat123 (免费) 进行一次外网映射。

各位请先把同步异步通知设为一个jsp页面 这样就可以让项目先跑起来 因为有些事情要忙 暂时更到这里 下一篇文章我将会弥补一下 这个文章内容的 遗漏部分 大牛勿喷,还望大牛指点迷津~~共同进步,下一篇文章将会讲解,同步异步通知 并且 完善下这个文章的遗漏

转载于:https://juejin.im/post/5af3dec86fb9a07ab7743981

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值