`
lzqustc
  • 浏览: 206318 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

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

    博客分类:
  • Perl
阅读更多

支付宝(蚂蚁金服)移动支付的交互流程请参考: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

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    支付宝支付(服务端开发)

    移动APP支付宝支付,服务端代码模型

    支付宝移动支付 (php java .net)版

    服务端支付宝移动支付的demo.可以随时用

    Android接入支付宝和微信支付的方法

    目前这2种接入方式对于APP端来说都已经比较方便了,因为大部分的安全校验之类的逻辑都在服务端。 APP端总结起来就是三步走: 接入支付的库 接受服务端的订单信息,发起调用支付宝和微信 接收支付宝和微信的回调 ...

    Laravel开发-alipay

    Laravel开发-alipay 支付宝移动无线产品服务端工具包

    alipay-mobilepay-java-sdk:支付宝钱包支付接口开发Java SDK

    支付宝钱包移动支付Java SDK[2015-11-4]本SDK实现**"功能流程"**图中的第2和第5步,并提供链接页面中**"数据交互"图中的第1和解析第9步。适用于构建图中所示的基于Java的“商户服务端”**。

    移动小商城:基于node,包含前后台

    该资源是一个移动小商城,使用了node.js技术,包含前后台功能。它具有以下特点: 1适用性强:该微信小程序源代码资源是一个移动小商城...同时,还支持多种支付方式,例如微信支付、支付宝支付等,方便用户的支付操作。

    应用商店-机锋市场Android源码.zip

    本源码不带服务端源码 项目内所有数据直接在机锋网获取 本项目源码为商业源码 售价50专家币 以下截图是项目编译后的工程截图 截图中的功能都已经实现 识货的朋友可以在后台在线充值后下载涉及模块&技术通知栏网络...

    Android应用源码完整功能版机锋安卓市场

    注意:本源码不带服务端源码 项目内所有数据直接在机锋网获取 本项目源码为商业源码 售价50专家币 以下截图是项目编译后的工程截图 截图中的功能都已经实现 识货的朋友可以在后台在线充值后下载 涉及模块&技术...

    【学生赚APP源码】 手赚APP源码带后台管理系统支持挂机+签到+兑换等功能

    用户可将赚得的收益提现到自己的支付宝或银行卡,然而在米赚之类的赚钱 APP上做任务单价很低, 本来下载一个应用可以得到8毛到1块不等的收益,在米赚之类做任务却只能拿到1毛钱或几分, 如果自己在这些移动广告...

    parking-control-app:停车场管理系统停车控制系统APP端

    :strawberry:强兼容性不更换以往抓拍机,可兼容市面90%的抓拍机品牌 :mobile_phone:移动支付直接使用微信支付宝等扫码支付,无需人工干预提高效率 :ticket:电子小票三轮车等无牌车可采用领取小票方式入场,全流程...

    parking-control-admin:停车场管理系统

    :mobile_phone:移动支付直接使用微信支付宝等扫码支付,无需人工干预提高效率 :ticket:电子小票三轮车等无牌车可采用领取小票方式入场,全流程无缝衔接 :hourglass_not_done:经停追踪搭配商户APP,可随时调阅车辆...

    parking-control-ticket:停车场管理系统停车控制系统小票端

    :mobile_phone:移动支付直接使用微信支付宝等扫码支付,无需人工干预提高效率 :ticket:电子小票三轮车等无牌车可采用领取小票方式入场,全流程无缝衔接 :hourglass_not_done:经停追踪搭配商户APP,可随时调阅车辆...

    asp.net知识库

    如何在客户端调用服务端代码 页面一postback,它就显示页面的最顶端,怎样让它定位在某一位置? 如何保证页面刷新后的滚动条位置 清除网页历史记录,屏蔽后退按钮! 如何传值在2个页面之间 :要求不刷新父页面,并且...

    史上最好传智播客就业班.net培训教程60G 不下会后悔

    站内搜索、栏目管理、视频播放(完全模仿优酷视频页面)、焦点图、静态页面生成(新浪、搜狐等大型...支付(支持支付宝、财付通、块钱等第三方支付平台)、网站调优(数据库优化、缓存、静态页、CSS Spirit、js压缩)...

Global site tag (gtag.js) - Google Analytics