我们首先要去官网下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.支付宝的验签~ 以及可能造成验签失败的原因
首先创建个项目
//设置请求参数
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();
}
}
}
}
复制代码
}