文档中心:https://doc.open.alipay.com/
点右上角的进入文档中心
使用的你的支付宝账号登录 ,实名认证后
点 开放者中心 -沙箱应用
生成商户应用公钥和私钥
https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=105971&docType=1
生成后会保存在本地
点沙箱应用中RSA2秘钥 设置公用秘钥
把本地生成的应用公钥填进去,会自动生成应用公钥和支付宝公钥
下载 手机网站支付SDK&Demo:https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.mS4BOD&treeId=193&articleId=105910&docType=1
AlipayConfig配置
public class AlipayConfig {
// 沙箱应用appid
//public static String APPID = "";
//正式线上应用appid
public static String APPID = "";
// 应用私钥 pkcs8格式的
public static String RSA_PRIVATE_KEY = "xxxx"
// 服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "http://xxxxx/notifyCallback.do";
// 页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
// 商户可以自定义同步跳转地址
public static String return_url = "http://xxxx/return_url.jsp";
// return_url.jsp";
// 请求网关地址
// public static String URL = "https://openapi.alipay.com/gateway.do";
//沙箱测试网关
public static String URL = "https://openapi.alipaydev.com/gateway.do";
// 编码
public static String CHARSET = "UTF-8";
// 返回格式
public static String FORMAT = "json";
// 支付宝公钥 不是应用公钥
// 沙箱测试支付宝公钥
// public static String ALIPAY_PUBLIC_KEY ="xXXXx"//
//正式线上支付宝公钥
public static String ALIPAY_PUBLIC_KEY = "xxxx"//
//日志记录目录
public static String log_path = "/log";
// RSA2
public static String SIGNTYPE = "RSA2";
}
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
/**
* API调用客户端工厂
*
* @author taixu.zqq
* @version $Id: AlipayAPIClientFactory.java, v 0.1 2014年7月23日 下午5:07:45
* taixu.zqq Exp $
*/
public class AlipayAPIClientFactory {
/** API调用客户端 */
private static AlipayClient alipayClient;
/**
* 获得API调用客户端
*
* @return
*/
public static AlipayClient getAlipayClient() {
if (null == alipayClient) {
// 实例化客户端
alipayClient = new DefaultAlipayClient(AlipayConfig.URL,
AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY,
AlipayConfig.FORMAT, AlipayConfig.CHARSET,
AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);
}
return alipayClient;
}
}
app支付服务端
https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.Y845Da&treeId=54&articleId=106370&docType=1
生成APP支付订单信息(orderInfo)
/**
* JAVA服务端SDK生成APP支付订单信息
* https://doc.open.alipay.com/docs/api.htm?spm=a219a.7629065.0.0.y7E1BI&
* apiId=1046&docType=4
*
* @param body
* 商品描述,可空
* @param subject
* @param out_trade_no
* 商户订单号,商户网站订单系统中唯一订单号,必填
* @param total_amount
* 付款金额,必填
* @return
*/
@ResponseBody
@RequestMapping(value = "/appbuildOrder", produces = "text/html;charset=UTF-8", method = RequestMethod.GET)
public String aliAppPay(String body, String subject, String out_trade_no, String total_amount) {
try {
// 中文乱码处理,不做处理可能会导致异步回调验证失败
body = new String(body.getBytes("ISO-8859-1"), "utf-8");
subject = new String(subject.getBytes("ISO-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// 获得API调用客户端
AlipayClient alipayClient = AlipayAPIClientFactory.getAlipayClient();
// 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
// SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
// 对交易或商品的描述
model.setBody(body);
// 卖家支付宝用户ID。 如果该值为空,则默认为商户签约账号对应的支付宝用户ID
// model.setSellerId("2088102170333051");
// 订单标题
model.setSubject(subject);
// 商户订单号,64个字符以内
model.setOutTradeNo(out_trade_no);
// 超时时间 可空
model.setTimeoutExpress("2m");
// 订单总金额 必须
model.setTotalAmount(total_amount);
// 销售产品码 必填
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
// 支付异步通知地址
request.setNotifyUrl(AlipayConfig.notify_url);
String form = "";
try {
// 这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
System.out.println(response.getBody());// 就是orderString
// 可以直接给客户端请求,无需再做处理。
form = response.getBody();
} catch (AlipayApiException e) {
e.printStackTrace();
}
return form;
}
异步回调通知
/**
* 支付统一回调接口
* https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.afod0z&
* treeId=193&articleId=105301&docType=1 异步通知地址
* 收到支付成功异步通知要回复success,否则导致支付宝重发数次通知,重发通知服务器异步通知参数notify_id是不变的。
*
* @param request
*/
@ResponseBody
@RequestMapping(value = "notifyCallback", produces = "text/html;charset=UTF-8")
public String notifyCallback(HttpServletRequest request) throws Exception {
// 获取支付宝POST过来反馈信息
Map<String, String> params = 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");
params.put(name, valueStr);
}
String subject = params.get("subject");
String body = params.get("body");
String gmt_create = params.get("gmt_create");
String gmt_payment = params.get("gmt_payment");
String gmt_refund = params.get("gmt_refund");
String refund_fee = params.get("refund_fee");
String gmt_close = params.get("gmt_close");
String fund_bill_list = params.get("fund_bill_list");
String trade_status = params.get("trade_status");
String out_trade_no = params.get("out_trade_no");
String trade_no = params.get("trade_no");
String notify_time = params.get("notify_time");
String notify_id = params.get("notify_id");
// 商户业务ID,主要是退款通知中返回退款申请的流水号
String out_biz_no = params.get("out_biz_no");
String buyer_id = params.get("buyer_id");
String seller_id = params.get("seller_id");
String total_amount = params.get("total_amount");
String receipt_amount = params.get("receipt_amount");
String invoice_amount = params.get("invoice_amount");
System.out.println(params.toString());
System.out.println("支付宝回调地址!");
System.out.println("订单标题:" + subject);
System.out.println("商品描述:" + body);
System.out.println("交易创建时间:" + gmt_create);
System.out.println("交易付款时间:" + gmt_payment);
System.out.println("交易退款时间:" + gmt_refund);
System.out.println("交易结束时间:" + gmt_close);
System.out.println("商户的订单编号:" + out_trade_no);
System.out.println("支付宝交易号:" + trade_no);
System.out.println("支付的状态:" + trade_status);
System.out.println("通知时间:" + notify_time);
System.out.println("通知校验ID:" + notify_id);
System.out.println("商户业务号:" + out_biz_no);
System.out.println("买家支付宝用户号:" + buyer_id);
System.out.println("卖家支付宝用户号:" + seller_id);
System.out.println("订单金额:" + total_amount);
System.out.println("实收金额:" + receipt_amount);
System.out.println("开票金额:" + invoice_amount);
System.out.println("支付金额信息:" + fund_bill_list);
System.out.println("总退款金额:" + refund_fee);
// 切记
// AlipayConfig.ALIPAY_PUBLIC_KEY是支付宝的公钥,不是应用公钥,请去open.alipay.com对应应用下查看。
boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET,
AlipayConfig.SIGNTYPE);
// 验证失败可能原因:AlipayConfig.ALIPAY_PUBLIC_KEY是支付宝的公钥,不是应用公钥,请去open.alipay.com对应应用下查看
// 创建订单时请求字段有乱码,异步回调才去处理中文乱码,导致验证失败(解决创建订单处理中文乱码,异步回调不处理)
if (verify_result) {// 验证成功
//
// 请在这里加上商户的业务逻辑程序代码
System.out.println("-----验证成功----");
// 注意:
// 状态TRADE_SUCCESS的通知触发条件是商户签约的产品支持退款功能的前提下,买家付款成功;
// 交易状态TRADE_FINISHED的通知触发条件是商户签约的产品不支持退款功能的前提下,买家付款成功;或者,商户签约的产品支持退款功能的前提下,交易已经成功并且已经超过可退款期限。
if (trade_status.equals("TRADE_FINISHED")) {
//业务处理
} else if (trade_status.equals("TRADE_SUCCESS")) {
//支付成功业务处理
} else if (trade_status.equals("TRADE_CLOSED")) {// 当商户使用站内退款时,系统会发送包含refund_status和gmt_refund字段的通知给商户。
if(StringUtils.isNotBlank(out_biz_no)){
//退款业务处理
}
}
return "success";
//
} else {
System.out.println("-----验证失败----");
return "failure";
}
}
}
android端
https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.b71f3q&treeId=193&articleId=105296&docType=1
沙箱测试
app支付只支持Android版接入,在使用sdk时,在支付接口前调用如下方法
EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX);
http请求服务器生成orderInfo
OkHttpUtils.get().url(AppURL.buildOrder_url)
.addParams("body", "我是商品描述")
.addParams("subject", "iphone7")
.addParams("out_trade_no", System.currentTimeMillis() + "")
.addParams("total_amount", "1000")
.build().execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
Toast.makeText(PayDemoActivity.this,
"订单创建失败", Toast.LENGTH_SHORT)
.show();
}
@Override
public void onResponse(String response, int id) {
if (!TextUtils.isEmpty(response)) {
final String orderInfo = response;
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(PayDemoActivity.this);
Map<String, String> result = alipay.payV2(orderInfo, true);
Log.i("msp", result.toString());
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
Thread payThread = new Thread(payRunnable);
payThread.start();
} else {
Toast.makeText(PayDemoActivity.this,
"订单创建失败", Toast.LENGTH_SHORT)
.show();
}
}
});
电脑网站支付
/**
* JAVA服务端SDK生成pc支付订单信息
* https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.PeSXkv&
* treeId=193&articleId=105899&docType=1
*
* @param body
* 商品描述,可空
* @param subject
* @param out_trade_no
* 商户订单号,商户网站订单系统中唯一订单号,必填
* @param total_amount
* 付款金额,必填
* @return
*/
@ResponseBody
@RequestMapping(value = "/WebPagebuildOrder", produces = "text/html;charset=UTF-8", method = RequestMethod.POST)
public String aliWebPagePay(String webbody, String subject, String out_trade_no, String total_amount) {
// 获得API调用客户端
AlipayClient alipayClient = AlipayAPIClientFactory.getAlipayClient();
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();// 创建API对应的request
AlipayTradePagePayModel model = new AlipayTradePagePayModel();
// 对交易或商品的描述
model.setBody(webbody);
// 卖家支付宝用户ID。 如果该值为空,则默认为商户签约账号对应的支付宝用户ID
// model.setSellerId("2088102170333051");
// 订单标题
model.setSubject(subject);
// 商户订单号,64个字符以内
model.setOutTradeNo(out_trade_no);
// 超时时间 可空
model.setTimeoutExpress("2m");
// 订单总金额 必须
model.setTotalAmount(total_amount);
// 销售产品码 必填
model.setProductCode("FAST_INSTANT_TRADE_PAY");
request.setBizModel(model);
request.setReturnUrl(AlipayConfig.return_url);
request.setNotifyUrl(AlipayConfig.notify_url);// 在公共参数中设置回跳和通知地址
// alipayRequest.setBizContent("{" + "
// \"out_trade_no\":\"20150320010101001\","
// + " \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," + "
// \"total_amount\":88.88,"
// + " \"subject\":\"Iphone6 16G\"," + " \"body\":\"Iphone6 16G\","
// + "
// \"passback_params\":\"merchantBizType%3d3C%26merchantBizNo%3d2016010101111\","
// + " \"extend_params\":{" + "
// \"sys_service_provider_id\":\"2088511833207846\"" + " }" + " }");//
// 填充业务参数
String form = "";
try {
form = alipayClient.pageExecute(request).getBody(); // 调用SDK生成表单
} catch (AlipayApiException e) {
e.printStackTrace();
}
return form;
}
jsp
<div id="main">
<form name=alipayment action='${pageContext.request.contextPath}/pay/WebPagebuildOrder.do' method=post target="_blank">
<div id="body" style="clear:left">
<dl class="content">
<dt>商户订单号:</dt>
<dd>
<input id="out_trade_no" name="out_trade_no" />
</dd>
<hr class="one_line">
<dt>订单名称:</dt>
<dd>
<input id="subject" name="subject" />
</dd>
<hr class="one_line">
<dt>付款金额:</dt>
<dd>
<input id="total_amount" name="total_amount" />
</dd>
<hr class="one_line"/>
<dt>商品描述:</dt>
<dd>
<input id="webbody" name="webbody" />
</dd>
<hr class="one_line">
<dt></dt>
<dd id="btn-dd">
<span class="new-btn-login-sp">
<button class="new-btn-login" type="submit" style="text-align:center;">确 认</button>
</span>
<span class="note-help">如果您点击“确认”按钮,即表示您同意该次的执行操作。</span>
</dd>
</dl>
</div>
</form>
<div id="foot">
<ul class="foot-ul">
<li>
支付宝版权所有 2015-2018 ALIPAY.COM
</li>
</ul>
</div>
</div>
</body>
<script language="javascript">
function GetDateNow() {
var vNow = new Date();
var sNow = "";
sNow += String(vNow.getFullYear());
sNow += String(vNow.getMonth() + 1);
sNow += String(vNow.getDate());
sNow += String(vNow.getHours());
sNow += String(vNow.getMinutes());
sNow += String(vNow.getSeconds());
sNow += String(vNow.getMilliseconds());
document.getElementById("out_trade_no").value = sNow;
document.getElementById("subject").value = "Iphone6 16G";
document.getElementById("total_amount").value = "100";
document.getElementById("webbody").value = "Iphone6 16G";
}
GetDateNow();
</script>
http://blog.csdn.net/qq_22484755/article/details/53126353?locationNum=9&fps=1
支付宝沙箱测试-ALI40247
http://blog.csdn.net/huyuchaoheaven/article/details/56280978