天天看点

java服务端和android支付宝支付

文档中心:https://doc.open.alipay.com/

点右上角的进入文档中心

java服务端和android支付宝支付

使用的你的支付宝账号登录 ,实名认证后

点 开放者中心 -沙箱应用

java服务端和android支付宝支付

生成商户应用公钥和私钥

https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=105971&docType=1

生成后会保存在本地

java服务端和android支付宝支付

点沙箱应用中RSA2秘钥 设置公用秘钥

java服务端和android支付宝支付

把本地生成的应用公钥填进去,会自动生成应用公钥和支付宝公钥

下载 手机网站支付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