Created
June 16, 2017 06:52
-
-
Save Loschcode/331eb5a003abf256890df68673a7b0a0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'cgi' | |
# Get notifications from Wirecard when a transaction has been done | |
class Api::Webhook::Wirecard::CustomersController < Api::ApplicationController | |
skip_before_filter :verify_authenticity_token | |
WIRECARD_CONFIG = Rails.application.config.wirecard | |
REQUEST_ID_TRIM = %w(-check-enrollment) | |
# country=CN&merchant_account_resolver_category=&response_signature=25bc1e774bb38a1fc6660857bdc3f4b708fbdb0e08680f0a5e26eac81e5981dc&city=%E5%8E%BF&group_transaction_id=&provider_status_code_1=&locale=zh_CN&requested_amount=717.28&completion_time_stamp=20160913133720&provider_status_description_1=&token_id=4304509873471003&authorization_code=981517&merchant_account_id=9105bb4f-ae68-4768-9c3b-3eda968f57ea&provider_transaction_referrer_id=&state=%E5%A4%A9%E6%B4%A5%E5%B8%82&first_name=jlk&email=customer17%40customer.com&transaction_id=630560ba-76c7-4e7b-ace8-ab0bf815a33a&provider_transaction_id_1=&status_severity_1=information&last_name=jlkjl&ip_address=127.0.0.1&transaction_type=purchase&status_code_1=201.0000&masked_account_number=401200******1003&status_description_1=3d-acquirer%3AThe+resource+was+successfully+created.&phone=%280856%29+856405495&transaction_state=success&requested_amount_currency=CNY&postal_code=300222&request_id=67f6865e-6cd7-4adb-92b5-fffdfdaba815& | |
# | |
def create | |
devlog.info "Wirecard started to communicate with us ..." | |
devlog.info("Raw datas : #{datas}") | |
if wrong_datas? | |
throw_api_error(:bad_format, {error: "Wrong datas transmitted"}, :bad_request) | |
return | |
end | |
devlog.info "Service received `#{datas[:request_id]}`, `#{datas[:merchant_account_id]}`, `#{datas[:transaction_id]}`" | |
devlog.info "It will be considered as `#{request_id}`, `#{merchant_id}`, `#{transaction_id}`" | |
# we get the important datas | |
# customer_email = datas[:email].first | |
# transaction_id = datas[:transaction_id].first | |
devlog.info "We will update the order payment ..." | |
checker = payment_checker.update_order_payment! | |
devlog.info "Order payment was refreshed." | |
# it doesn't matter if the API call failed, the order has to be systematically up to date with the order payment in case it's not already sent | |
devlog.info "We synchronize the order status depending on the refreshed payment one ..." | |
order_payment.order.refresh_status_from!(order_payment) | |
order = order_payment.order | |
shop = order.shop | |
if checker.success? | |
devlog.info "The order was refreshed and seem to be paid." | |
DispatchNotification.new.perform({ | |
user: shop.shopkeeper, | |
title: "Auftrag #{order.id} am #{order.paid_at}", | |
desc: "Eine neue Bestellung ist da. Zeit für die Vorbereitung!" | |
}) | |
DispatchNotification.new.perform({ | |
user: order.user, | |
title: "来因盒通知:付款成功,已通知商家准备发货 (订单号:#{order.id})", | |
desc: "你好,你的订单#{order.id}已成功付款,已通知商家准备发货。若有疑问,欢迎随时联系来因盒客服:customer@germanyinthebox.com。" | |
}) | |
else | |
devlog.info "The order was refreshed but don't seem to be paid. (#{checker.error})" | |
end | |
devlog.info "End of process." | |
render status: :ok, | |
json: {success: true}.to_json | |
end | |
# WARNING : Must stay public for throw_error to work well for now. | |
def devlog | |
@@devlog ||= Logger.new(Rails.root.join("log/wirecard-customers-webhook-#{Time.now.strftime('%Y-%m-%d')}.log")) | |
end | |
private | |
def datas | |
@datas ||= CGI.parse(request.body.read).deep_symbolize_keys | |
end | |
def wrong_datas? | |
datas[:merchant_account_id].nil? || datas[:request_id].nil? || datas[:transaction_id].nil? | |
end | |
def order_payment | |
@order_payment ||= OrderPayment.where({merchant_id: merchant_id, request_id: request_id}).first | |
end | |
# make API call which refresh order payment | |
# this will also update the `transaction_id` if needed | |
# sometimes people are cut in the middle of the transactions | |
# and the order payment transaction_id is not recovered. this is made to solve this problem. | |
def payment_checker | |
@payment_checker ||= WirecardPaymentChecker.new({ | |
:transaction_id => transaction_id, | |
:order_payment => order_payment | |
}) | |
end | |
def request_id | |
@request_id ||= begin | |
raw_request_id = datas[:request_id].first | |
REQUEST_ID_TRIM.each do |trim_pattern| | |
raw_request_id.gsub!(trim_pattern, "") | |
end | |
raw_request_id | |
end | |
end | |
def transaction_id | |
@transaction_id ||= datas[:transaction_id].first | |
end | |
def merchant_id | |
@merchant_id ||= datas[:merchant_account_id].first | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment