在线票务与费用报销的Mashup应用实现
在当今数字化时代,Mashup技术为不同系统之间的集成提供了强大的解决方案。本文将详细介绍在线票务处理和费用报销流程中如何运用Mashup API实现系统集成。
在线票务处理流程
在开始主要处理之前,需要从客户那里获取足够的信息。以下是实现这一流程的关键步骤:
1.
创建集成方法
:在
ticketing_controller.rb
文件中创建
process_payment
方法,该方法将所有集成操作关联起来。
def process_payment
if do_payment.ack == 'Success' then
send_sms
add_to_calendar
end
end
此方法调用了三个私有方法,首先执行支付交易,检查支付是否成功,若成功则发送短信票务并添加到谷歌日历。
2.
创建视图模板
:在
RAILS_ROOT/app/views/ticketing
文件夹中创建
process_payment.rhtml
文件,用于显示支付处理的成功或失败信息。
与PayPal集成进行支付处理
PayPal是一家提供在线支付和资金转移服务的金融公司。在票务系统中,我们使用PayPal的Direct Payment API来处理信用卡支付。
1.
安装Ruby - PayPal库
:在命令行中输入以下命令安装库。
$gem install ruby-paypal
-
获取客户信息
:处理信用卡支付需要以下客户信息:
- 卡类型(如Visa、Mastercard等)
- 卡号
- CVV2(在生产环境中必要,但在沙盒环境可忽略)
- 过期日期(格式为MMYYYY)
- 客户IP地址
- 支付金额
- 客户姓名
-
创建支付处理方法
:在
ticketing_controller.rb文件中添加以下代码。
require 'ruby-paypal'
def do_payment
paypal = Paypal.new('<merchant_username>', '<merchant_password>',
'<merchant_API_signature>')
ipaddr = request.remote_ip
amount = session[:payment].amount
card_type = session[:payment].card_type
card_no = session[:payment].card_no
month = session[:payment].exp_date[:month].to_i < 10 ? "0" +
session[:payment].exp_date[:month] : session[:payment].
exp_date[:month]
exp_date = "#{month}#{session[:payment].exp_date[:year]}"
first_name = session[:payment].first_name
last_name = session[:payment].last_name
return paypal.do_direct_payment_sale(ipaddr, amount,
card_type, card_no, exp_date, first_name, last_name)
end
该方法创建了
Paypal
对象,并调用
do_direct_payment_sale
方法进行最终销售的直接支付。
以下是支付处理的流程图:
graph TD;
A[开始] --> B[获取客户信息];
B --> C[创建Paypal对象];
C --> D[调用支付方法];
D --> E{支付是否成功};
E -- 是 --> F[发送短信并添加到日历];
E -- 否 --> G[结束];
F --> G;
与谷歌日历集成
使用GoogleCalendar库与谷歌日历集成相对简单,主要包括两个步骤:登录GData服务和添加新的谷歌日历事件。
1.
添加依赖
:在
ticketing_controller.rb
文件顶部添加以下代码。
require 'googlecalendar'
-
创建添加日历事件方法
:在
ticketing_controller.rb文件中创建add_to_calendar方法。
def add_to_calendar
gcal = GData.new
account = session[:payment].google_acct
password = session[:payment].google_pwd
gcal.login(account, password)
time_start = Time.mktime(session[:movie].date[:year],
session[:movie].date[:month],
session[:movie].date[:day],
session[:movie].time[:hour],
session[:movie].time[:min])
time_end = time_start + (session[:movie].duration.to_i * 60)
event =
{ :title=> "Watch movie #{session[:movie].name}",
:content=> "Watch movie #{session[:movie].name}",
:author=> "#{session[:payment].first_name} #{ session[:payment].last_name }",
:email=> session[:payment].google_acct,
:where=> session[:movie].theater,
:startTime => time_start.utc.strftime('%Y-%m-%dT%H:%M:%SZ'),
:endTime => time_end.utc.strftime('%Y-%m-%dT%H:%M:%SZ') }
gcal.new_event(event)
end
此方法首先登录GData服务,然后使用
new_event
方法将新事件添加到客户的主谷歌日历中。
与Clickatell集成发送短信票务
使用Clickatell作为短信网关发送票务短信。
1.
创建短信类
:在
RAILS_ROOT/lib
文件夹中创建
sms.rb
文件。
class SMS
def initialize(login,password,api_id)
res = Net::HTTP.post_form(
URI.parse('http://api.clickatell.com/http/auth'),
{'api_id' => api_id,
'user'=> login,
'password' => password})
case res
when Net::HTTPSuccess, Net::HTTPRedirection
@clickatell_session_id = res.body.split(': ')[1]
else
puts res.error!
end
end
def send(message, mobile_no)
begin
res = Net::HTTP.post_form(
URI.parse('http://api.clickatell.com/http/sendmsg'),
{'session_id' => @clickatell_session_id,
'cliMsgId' => 'Chapter7',
'to'=> mobile_no,
'from' => '<a valid sender ID>',
'text' => message,
'callback' => '3',
'deliv_ack' => '1',
'req_feat' => '8192' })
case res
when Net::HTTPSuccess, Net::HTTPRedirection
return true
else
return false
end
rescue
puts "## Cannot send sms : #{$!}"
end
end
end
-
创建发送短信方法
:在
ticketing_controller.rb文件中添加send_sms方法。
def send_sms
sms = SMS.new('<Clickatell user name>', '<Clickatell password>',
'<Clickatell API ID>')
message = "You have bought 3 tickets for #{session[:movie].
name} at #{session[:movie].theater} on #{session[:
movie].date[:day]}/#{session[:movie].date[:
month]}/#{session[:movie].date[:year]} #{session[:
movie].time[:hour]}:#{session[:movie].time[:min]}. Your
seat numbers are S10 to S13. Enjoy your movie!"
sms.send(message, session[:payment].mobile_no)
end
费用报销Mashup插件
在企业环境中,员工费用报销是常见的支付场景。费用报销Mashup插件允许员工在谷歌文档和电子表格中提交费用报销申请,经理审批后,通过PayPal进行报销支付。
费用报销流程
- 员工提交报销申请 :员工在谷歌文档和电子表格中创建并填写费用报销电子表格,附加费用凭证(如收据),然后与经理共享这些文档。
- 经理审批 :经理接收共享文档后,批准或拒绝费用报销申请。若批准,则将申请放入批准报销文件夹。
- 自动化处理 :定期运行rake脚本,检索批准报销文件夹中的所有申请文档,解析电子表格以获取报销详情和金额,将凭证存储在数据库中,使用报销金额在PayPal中创建报销支付,处理完后将报销电子表格移至垃圾桶。
- 月末支付 :月末运行另一个rake脚本,向所有员工发送工资和报销款项。
系统设计
为该Mashup创建
Payment
类,该类代表向员工的支付。支付分为月薪和月度费用报销两种类型,使用Rails内置的单表继承设计将
Payment
子类化为
Salary
和
Claim
类。每个费用报销通常包含多个报销项目,因此
Claim
对象将包含一个或多个
Claim Item
对象。同时,需要一个
Manager
类来管理经理的账户。
所使用的Mashup API
- PayPal :使用PayPal的Mass Payment API,该API允许在一次API调用中向最多250个接收者发送付款。发送者需支付交易费用,当前每笔交易费用为2%,最高1美元。使用Ruby - PayPal库封装NVP API。
- Google :使用谷歌的四个不同Mashup API,这些API都属于Google Data APIs家族。
以下是费用报销流程的表格总结:
|步骤|描述|
| ---- | ---- |
|1|员工创建并填写报销电子表格|
|2|员工附加费用凭证|
|3|员工与经理共享文档|
|4|经理审批申请|
|5|经理将批准申请放入文件夹|
|6|定期运行脚本检索文档|
|7|脚本解析表格并存储凭证|
|8|在PayPal创建报销支付|
|9|将处理后的表格移至垃圾桶|
|10|月末发送工资和报销款项|
通过以上Mashup API的集成,实现了在线票务处理和费用报销流程的自动化和系统集成,提高了业务处理效率和用户体验。
关键技术点分析
支付相关技术细节
-
PayPal支付
- 数据验证 :在使用PayPal进行支付时,对客户提供的信用卡信息进行了严格验证。例如,卡类型必须是PayPal支持的类型,如Visa、Mastercard等;卡号使用Luhn算法进行有效性检查。这有助于在发送请求前就发现可能的错误,减少与PayPal服务器交互的错误率。
-
支付方式
:PayPal的Direct Payment API提供了两种支付方式,最终销售和支付授权。在票务处理中,选择了更简单的最终销售方式,即使用
do_direct_payment_sale方法请求全额最终支付。而在费用报销中,使用了Mass Payment API,允许一次向多个接收者付款,提高了批量处理的效率。 - 业务规则 :在实际应用中,使用PayPal进行支付需要遵循一些业务规则,如商家在要求客户提供账单和运输信息之前需要展示Express Checkout和相关消息,将PayPal作为支付选项与其他选项一起显示,并在适用的地方展示PayPal图标。
- CVV2验证 :CVV2是信用卡的安全验证值,用于防止信用卡欺诈。在生产环境中,PayPal需要CVV2进行验证,但在沙盒环境中,除非CVV2设置为‘000’会返回错误,否则沙盒会忽略该值。在票务处理示例中,由于使用沙盒环境,未使用CVV2。
日历集成技术细节
-
Google Calendar集成
:使用GoogleCalendar库与谷歌日历集成,主要步骤包括登录GData服务和添加新事件。通过
GData对象的login方法进行身份验证,然后使用new_event方法将票务信息作为新事件添加到客户的主谷歌日历中。事件信息包括标题、内容、作者、时间等,确保客户可以方便地在日历中查看票务安排。
短信发送技术细节
- Clickatell短信网关 :使用Clickatell作为短信网关发送票务短信。在每次发送短信前,需要进行登录操作以获取会话ID。在实际生产环境中,这种每次都登录的方式效率较低,应进行重构以存储会话ID一段时间,避免频繁登录。
代码优化建议
票务处理代码优化
-
错误处理
:在
process_payment方法中,可以添加更详细的错误处理逻辑。例如,当do_payment方法返回失败时,记录错误信息并向用户显示友好的错误提示。
def process_payment
begin
payment_response = do_payment
if payment_response.ack == 'Success'
send_sms
add_to_calendar
else
# 记录错误信息
Rails.logger.error("Payment failed: #{payment_response.inspect}")
# 向用户显示错误提示
flash[:error] = "Payment processing failed. Please try again."
end
rescue StandardError => e
# 处理异常
Rails.logger.error("An error occurred during payment processing: #{e.message}")
flash[:error] = "An unexpected error occurred. Please contact support."
end
end
-
代码复用
:在
do_payment方法中,部分代码可以提取为独立的方法,提高代码的复用性。例如,将日期格式化的代码提取为一个单独的方法。
def format_expiry_date(exp_date)
month = exp_date[:month].to_i < 10 ? "0#{exp_date[:month]}" : exp_date[:month]
"#{month}#{exp_date[:year]}"
end
def do_payment
paypal = Paypal.new('<merchant_username>', '<merchant_password>', '<merchant_API_signature>')
ipaddr = request.remote_ip
amount = session[:payment].amount
card_type = session[:payment].card_type
card_no = session[:payment].card_no
exp_date = format_expiry_date(session[:payment].exp_date)
first_name = session[:payment].first_name
last_name = session[:payment].last_name
return paypal.do_direct_payment_sale(ipaddr, amount, card_type, card_no, exp_date, first_name, last_name)
end
费用报销代码优化
- 脚本优化 :在rake脚本中,可以添加日志记录和错误处理,确保脚本在出现问题时能够及时发现和处理。例如,在解析报销电子表格时,如果出现错误,记录错误信息并跳过该记录。
task :process_expense_claims => :environment do
begin
# 检索批准报销文件夹中的所有申请文档
claim_docs = retrieve_approved_claims
claim_docs.each do |doc|
begin
# 解析电子表格以获取报销详情和金额
claim_details = parse_claim_doc(doc)
# 将凭证存储在数据库中
store_evidence(claim_details)
# 使用报销金额在PayPal中创建报销支付
create_paypal_payment(claim_details)
# 将处理后的表格移至垃圾桶
move_doc_to_trash(doc)
rescue StandardError => e
# 记录错误信息
Rails.logger.error("Error processing claim document #{doc.id}: #{e.message}")
end
end
rescue StandardError => e
# 处理脚本执行过程中的异常
Rails.logger.error("An error occurred during expense claim processing: #{e.message}")
end
end
总结
通过Mashup API的集成,实现了在线票务处理和费用报销流程的自动化和系统集成。在票务处理中,与PayPal、谷歌日历和Clickatell的集成,为用户提供了便捷的购票体验,同时将票务信息同步到日历并发送短信通知。在费用报销流程中,利用PayPal和谷歌的API,实现了员工费用报销的自动化处理,提高了企业的财务管理效率。
在实际应用中,需要注意遵循各API的业务规则和安全要求,同时对代码进行优化,提高系统的稳定性和可维护性。通过不断地优化和改进,Mashup技术将为更多的业务场景提供高效的解决方案。
以下是整个系统集成的流程图:
graph LR;
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B(票务处理):::process;
B --> C{支付是否成功}:::decision;
C -- 是 --> D(发送短信):::process;
C -- 是 --> E(添加到日历):::process;
C -- 否 --> F(显示错误提示):::process;
D --> G(结束票务处理):::process;
E --> G;
F --> G;
G --> H(费用报销处理):::process;
H --> I(员工提交申请):::process;
I --> J(经理审批):::process;
J --> K{是否批准}:::decision;
K -- 是 --> L(定期脚本处理):::process;
K -- 否 --> M(结束报销处理):::process;
L --> N(解析表格):::process;
N --> O(存储凭证):::process;
O --> P(创建PayPal支付):::process;
P --> Q(移动文档到垃圾桶):::process;
Q --> R(月末支付):::process;
R --> S([结束]):::startend;
M --> S;
通过以上的集成和优化,系统能够更好地满足用户和企业的需求,为业务的发展提供有力支持。
在线票务与报销Mashup实现
超级会员免费看
17

被折叠的 条评论
为什么被折叠?



