支付宝移动支付之服务端实现_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 支付宝移动支付之服务端实现

支付宝移动支付之服务端实现

 2017/10/18 18:25:43  lzqustc  程序员俱乐部  我要评论(0)
  • 摘要:支付宝(蚂蚁金服)移动支付的交互流程请参考:https://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103658&docType=1和微信支付的流程大体一致,即:1、客户端提交订单内容信息2、服务端根据订单内容信息(可以根据业务需要添加额外信息,而且要指定notify_url地址),按照签名规则生成签名后的订单参数,返回给客户端。注意:服务端只要负责生成签名后的订单参数,不需要请求支付宝服务器。而微信支付过程
  • 标签:实现 服务端 服务 支付宝

支付宝(蚂蚁金服)移动支付的交互流程请参考:https://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103658&docType=1

?

和微信支付的流程大体一致,即:

1、客户端提交订单内容信息

2、服务端根据订单内容信息(可以根据业务需要添加额外信息,而且要指定notify_url地址),按照签名规则生成签名后的订单参数,返回给客户端。

注意:服务端只要负责生成签名后的订单参数,不需要请求支付宝服务器。

而微信支付过程,服务端事先要调统一下单获得预订单支付信息。

3、客户端调用支付接口(参数就是服务端返回的签名后的订单信息)完成支付。

4、服务端收到异步通知,完成相关业务逻辑。

?

# 订单参数举例:

{

? ? app_id : "2015052600090779",

? ??biz_content :{"timeout_express":"30m","seller_id":"","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是测试数据","out_trade_no":"IQJZSRC1YMQB5HU"}

? ??charset?: "utf-8",

? ??format?: "json",

? ??method?: "alipay.trade.app.pay",

? ??notify_url?: "http://domain.merchant.com/payment_notify",

? ??sign_type?: "RSA",

? ??timestamp?: "2016-08-25 20:26:31",

? ??version?: "1.0"

}

?

# 服务端签名函数:

use utf8;

use Time::Local;

use JSON;

use URI::Escape; #url编码

?

sub alipay_get_prepay {

? ??my $order_info = $_[0];

?

? ? # 组织订单参数

? ??my $total_amount = sprintf("%.2f", $order_info->{rmb}+0); #订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]

? ??my $PayInfo;

? ??$PayInfo->{app_id} = $ALIPAY_CONFIG->{appid};

? ??#$PayInfo->{biz_content} = {

? ??# ? body=>"充值支付", #最大长度128

? ??# ? out_trade_no=>$order_info->{_id}, #最大长度64

? ??# ? product_code=>$ALIPAY_CONFIG->{product_code}, #销售产品码,商家和支付宝签约的产品码, 最大长度64

? ??# ? subject=>$order_info->{order_id}, #最大长度256

? ??# ? total_amount=>"$total_amount", #最大长度9

? ??#};

? ??$PayInfo->{biz_content} = '{"body":"RECHAGE","out_trade_no":"'.$order_info->{_id}.'", "product_code":"'.$ALIPAY_CONFIG->{product_code}.'", "subject":"'.$order_info->{order_id}.'","total_amount":"'.$total_amount.'"}';

?

? ??$PayInfo->{charset} = $ALIPAY_CONFIG->{charset};

? ??$PayInfo->{format} = "json";

? ??$PayInfo->{method} = $ALIPAY_CONFIG->{method};

? ??$PayInfo->{notify_url} = $P_NOTIFY_URL;

? ??$PayInfo->{sign_type} = $ALIPAY_CONFIG->{sign_type};

? ??$PayInfo->{timestamp} = formateTime(time());

? ??$PayInfo->{version} = "1.0";

? ??my $ret_sign = rsa_sign($PayInfo, $ALIPAY_CONFIG->{rsa_private_key});

? ??$PayInfo->{sign} = $ret_sign->{sign};

? ??

? ? #对所有value(biz_content作为一个value)进行url encode

? ? # 请求参数说明参考官网:https://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103663&docType=1

? ??my $params_sign = {};

? ??foreach (keys %{$PayInfo}) {

? ??? ??$params_sign->{$_} = uri_escape_utf8($PayInfo->{$_});

? ??}

? ??my $sign_string = join( '&',?map { sprintf( '%s=%s', $_, $params_sign->{$_} ) }?sort { $a cmp $b } keys %$params_sign ); ? ?# 构造签名后请求参数返回给客户端

? ??my $ret;

? ??$ret->{sign_str} = $sign_string;

? ??$ret->{unsign} = $ret_sign->{unsign};

? ??return $ret;

}

?

由于仅支持RSA或DSA的签名算法,而Perl语言尝试多次后都是签名错误,所以只好利用官方提供的Java例子,通过Perl命令行方式执行Java的RSA签名算法。具体如下:

支付宝签名规则参考:签名机制

sub rsa_sign {

? ??my ($params, $rsa_private_key)= @_;

? ??my $params_sign = {};

? ??foreach ( keys %$params ) {

? ??? ??next if $_ eq 'sign';

? ??? ??next unless defined $params->{$_};

? ??? ??Encode::_utf8_off( $params->{$_} );

? ??? ??$params_sign->{$_} = $params->{$_};

? ??}

?

? ??my $sign_string = join( '&',

? ??? ??? ??? ??? ??? ??? ??map { sprintf( '%s=%s', $_, $params_sign->{$_} ) }

? ??? ??? ??? ??? ??? ??? ??sort { $a cmp $b } keys %$params_sign );

? ??# 执行Java命令,得到签名结果

? ??my $file_path = "/var/www/app/";

? ??my?$sign = `cd $file_path;?java -cp . RSA '$rsa_private_key' '$sign_string?'`;

? ??my $ret;

? ??$ret->{sign} = $sign;

? ??$ret->{unsign} = $sign_string;

? ??return $ret;

}

在/var/www/app/?目录下需要有java的以下几个文件:

RSA.java 源文件;

以及 javac RSA.java 编译后的两个文件:

RSA$Base64.classRSA.class

?

?

?

?

?

?

?

?

?

  • RSA.rar (2.8 KB)
  • 下载次数: 0
发表评论
用户名: 匿名