支付宝移动支付服务器端

1、客户端调用服务器端接口,服务器端返回签名后的订单信息,代码如下:
//获取订单信息,返回客户端
public static String getPayInfo(String subject, String body, String tradeNo, String price) {
// 订单
String info = getOrderInfo(subject, body, tradeNo, price);
String sign = sign(info);
try {
sign = URLEncoder.encode(sign, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String payInfo = info + "&sign=\"" + sign + "\"&" + getSignType();
return payInfo;
}

/**
* create the order info. 创建订单信息
*
*/
private static String getOrderInfo(String subject, String body, String tradeNo, String price) {

// 签约合作者身份ID
String orderInfo = "partner=" + "\"" + Keys.DEFAULT_PARTNER + "\"";

// 签约卖家支付宝账号
orderInfo += "&seller_id=" + "\"" + Keys.DEFAULT_SELLER + "\"";

// 商户网站唯一订单号
orderInfo += "&out_trade_no=" + "\"" + tradeNo + "\"";

// 商品名称
orderInfo += "&subject=" + "\"" + subject + "\"";

// 商品详情
orderInfo += "&body=" + "\"" + body + "\"";

// 商品金额
orderInfo += "&total_fee=" + "\"" + price + "\"";

// 服务器异步通知页面路径,也可以是通知的接口
orderInfo += "&notify_url=" + "\"" + "https://api.xx.com/receive_notify.htm" + "\"";

// 服务接口名称, 固定值
orderInfo += "&service=\"mobile.securitypay.pay\"";

// 支付类型, 固定值
orderInfo += "&payment_type=\"1\"";

// 参数编码, 固定值
orderInfo += "&_input_charset=\"utf-8\"";

// 设置未付款交易的超时时间
// 默认30分钟,一旦超时,该笔交易就会自动被关闭。
// 取值范围:1m~15d。
// m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。
// 该参数数值不接受小数点,如1.5h,可转换为90m。
orderInfo += "&it_b_pay=\"30m\"";

// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
// orderInfo += "&extern_token=" + "\"" + extern_token + "\"";

// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空
orderInfo += "&return_url=\"m.alipay.com\"";

return orderInfo;
}

/**
* sign the order info. 对订单信息进行签名
*
* @param content
* 待签名订单信息
*/
private static String sign(String content) {
return SignUtils.sign(content, Keys.PRIVATE);
}

/**
* get the sign type we use. 获取签名方式
*
*/
private static String getSignType() {
return "sign_type=\"RSA\"";
}
2、客户端直接调用支付宝客户端,支付订单
3、服务器端获取支付宝服务器端返回的异步通知,通知信息见 https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.4bmJFg&treeId=59&articleId=103666&docType=1
接收通知的为订单信息中的notify_url,然后按照步骤:
1、验证签名
首先必需 验证签名 ,然后验证是否是支付宝发来的通知。
代码如下:
/**
* 根据反馈回来的信息,生成签名结果
*
* @param Params
* 通知返回来的参数数组
* @param sign
* 比对的签名结果
* @return 生成的签名结果
*/
public static boolean getSignVeryfy(Map<String, String> Params, String sign) {
// 过滤空值、sign与sign_type参数
Map<String, String> sParaNew = AlipayCore.paraFilter(Params);
// 获取待签名字符串
String preSignStr = AlipayCore.createLinkString(sParaNew);
// 获得签名验证结果
boolean isSign = false;
if (AlipayConfig.sign_type.equals("RSA")) {
isSign = RSA.verify(preSignStr, sign, AlipayConfig.alipay_public_key, AlipayConfig.input_charset);
}
return isSign;
}
/**
* 除去数组中的空值和签名参数
*
* @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
* 需要参与字符拼接的参数组
* @param sorts
* 是否需要排序 true 或者 false
* @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;
}
/**
* RSA验签名检查
* @param content 待签名数据
* @param sign 签名值
* @param alipay_public_key 支付宝公钥
* @param input_charset 编码格式
* @return 布尔值
*/
public static boolean verify(String content, String sign, String alipay_public_key, String input_charset)
{
try
{
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
byte[] encodedKey = Base64.decode(alipay_public_key);
PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));

java.security.Signature signature = java.security.Signature
.getInstance(SIGN_ALGORITHMS);
signature.initVerify(pubKey);
signature.update( content.getBytes(input_charset) );
boolean bverify = signature.verify( Base64.decode(sign) );
return bverify;
}
catch (Exception e)
{
e.printStackTrace();
}
return false;
}
2、验证是否是支付宝发来的通知
代码如下:
/**
* 获取远程服务器ATN结果,验证返回URL
*
* @param notify_id
* 通知校验ID
* @return 服务器ATN结果 验证结果集: invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空 true
* 返回正确信息 false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
*/
public static String verifyResponse(String notify_id) {
// 获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求

String partner = AlipayConfig.partner;
String veryfy_url = HTTPS_VERIFY_URL + "partner=" + partner + "&notify_id=" + notify_id;

return checkUrl(veryfy_url);
}

/**
* 获取远程服务器ATN结果
*
* @param urlvalue
* 指定URL路径地址
* @return 服务器ATN结果 验证结果集: invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空 true
* 返回正确信息 false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
*/
public static String checkUrl(String urlvalue) {
String inputLine = "";

try {
URL url = new URL(urlvalue);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
inputLine = in.readLine().toString();
} catch (Exception e) {
e.printStackTrace();
inputLine = "";
}

return inputLine;
}
3、业务数据处理
1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,2、判断total_fee是否确实为该订单的实际金额(即商户订单创建时的金额),3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email),4、判断partner_id是否为商户本身。上述步骤1、2、3、4任何一个验证不通过,则表明本次通知是异常通知,务必忽略。在上述验证通过后商户必须根据支付宝不同类型的业务通知,正确的进行不同的业务处理,并且过滤重复的通知结果数据。在支付宝的业务通知中,只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时,支付宝才会认定为买家付款成功。


支付宝服务器端jar包本地maven生成(maven已安装):
1、下载支付宝服务器端jar包到本地
2、alipay-sdk-java20161114120103.jar移动到D盘根目录
3、在命令行窗口执行如下命令:
mvn install:install-file -Dfile=D:\alipay-sdk-java20161114120103.jar -DgroupId=com.alipay -DartifactId=sdk-Java
-Dversion=20161114120103 -Dpackaging=jar
4、
maven配置:
<dependency>
<groupId>com.alipay</groupId>
<artifactId>sdk-Java</artifactId>
<version>20161114120103</version>
</dependency>
5、更新项目maven



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值