khipu-rails 0.0.1 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +57 -11
- data/app/controllers/khipu_rails/application_controller.rb +5 -0
- data/app/controllers/khipu_rails/khipu_controller.rb +23 -0
- data/app/views/khipu_rails/khipu/notification.html +2 -0
- data/app/views/layouts/khipu_rails/application.html.erb +10 -0
- data/config/khipu.pem.cer +81 -0
- data/config/khipu_dev.pem.cer +22 -0
- data/config/routes.rb +3 -0
- data/khipu-rails.gemspec +6 -4
- data/lib/khipu-rails.rb +2 -0
- data/lib/khipu_rails.rb +60 -1
- data/lib/khipu_rails/button_helper.rb +45 -34
- data/lib/khipu_rails/config.rb +25 -17
- data/lib/khipu_rails/notification_validator.rb +47 -0
- data/lib/khipu_rails/receiver.rb +17 -0
- data/lib/khipu_rails/version.rb +1 -1
- data/spec/khipu_rails/button_helper_spec.rb +200 -0
- data/spec/khipu_rails/config_spec.rb +65 -0
- data/spec/khipu_rails/notification_validator_spec.rb +64 -0
- data/spec/khipu_rails/receiver_spec.rb +26 -0
- data/spec/khipu_rails_spec.rb +52 -0
- data/spec/spec_helper.rb +1 -4
- data/vendor/assets/javascripts/atmosphere.js +3081 -0
- data/vendor/assets/javascripts/khipu.js +373 -0
- metadata +71 -35
- data/spec/khipu_rails/khipu_helpers_spec.rb +0 -104
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: afe86cd2381326f7498e3e3d18705bd590601c65
|
4
|
+
data.tar.gz: 9e15f6290e3c8ab8d6da845d7a120576dca1b029
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 31339a0a406d849fef4be7669f9f5207f00f4597848def1c786e3ce5de483104bed8593453be89e5de3f005db3409f9c001621d862147560d6536df7db972e6e
|
7
|
+
data.tar.gz: eba94c9ac2b82464460ae4052f4cfa650fbb8433ddc5f3841513343d05746f20d38470da3a946a88c65968d79d332930c9477c1b0f0ecae5faf64f8122d24628
|
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# KhipuRails
|
2
2
|
|
3
|
-
[Khipu](https://khipu.com/home) is a service that facilitates web billing and collection in Chile
|
3
|
+
[Khipu](https://khipu.com/home) is a service that facilitates web billing and collection in **Chile**.
|
4
|
+
|
4
5
|
It handles very elegantly bank transfers and allows to generate bills in batches.
|
5
6
|
It offers an API for developers to create via POST new charges.
|
6
7
|
|
@@ -11,13 +12,38 @@ Add to your Gemfile and run the `bundle` command to install it.
|
|
11
12
|
gem 'khipu-rails'
|
12
13
|
```
|
13
14
|
|
14
|
-
|
15
|
+
If you want to work with the gem in development, you can allways use the git repository.
|
15
16
|
```ruby
|
16
|
-
|
17
|
-
KhipuRails::Config.api_key = API KEY
|
17
|
+
gem 'khipu-rails', :git => "http://github.com/Janther/khipu-rails"
|
18
18
|
```
|
19
19
|
|
20
|
-
|
20
|
+
## Configuration v0.0.2
|
21
|
+
Version 0.0.2 will have a configure method much more flexible and powerfull
|
22
|
+
```ruby
|
23
|
+
KhipuRails.configure do |config|
|
24
|
+
##
|
25
|
+
# Use receivers to set one or more receivers to the gem.
|
26
|
+
# #add_receiver has 3 parameters, receiver_id, receiver_key, and receiver_mode(:dev|:pro)
|
27
|
+
##
|
28
|
+
config.add_receiver "receiver1_id", "receiver1_key", :dev
|
29
|
+
config.add_receiver "receiver2_id", "receiver2_key", :pro
|
30
|
+
...
|
31
|
+
|
32
|
+
##
|
33
|
+
# Use button_images to set one or more urls for the custom button images you might have.
|
34
|
+
# Khipu's images are already registered.
|
35
|
+
# Each button image is key/value pair
|
36
|
+
# The same as with the receivers registration, use this method as a shortcut for long urls on your view.
|
37
|
+
##
|
38
|
+
config.button_images.merge! :shortcut => "url"
|
39
|
+
|
40
|
+
##
|
41
|
+
# The hash defaults can also be modified, giving you control of the default values the helper khipu_button uses.
|
42
|
+
##
|
43
|
+
config.button_defaults.merge! :variable_name => variable_value
|
44
|
+
end
|
45
|
+
```
|
46
|
+
*receiver_id and receiver_key can be found [here](https://khipu.com/merchant/profile#instant-notification-data)*
|
21
47
|
|
22
48
|
# Features
|
23
49
|
|
@@ -64,18 +90,38 @@ Options:
|
|
64
90
|
|
65
91
|
**200x75**: ![200x75 Button](https://s3.amazonaws.com/static.khipu.com/buttons/200x75.png)
|
66
92
|
|
67
|
-
|
68
|
-
|
69
|
-
## Validation of payment notifications
|
93
|
+
## Validation of payment notifications *(Waiting for Khipu to release developer accounts.)*
|
70
94
|
|
71
95
|
If you provide an URL for Khipu to deliver [notifications](https://khipu.com/page/api#notification-instantanea) on succesfull payments, this gem provides a validation method to prevent forgery of notifications.
|
72
96
|
|
73
97
|
### khipu_validation
|
74
98
|
|
75
|
-
**
|
99
|
+
**KhipuRails::NotificationValidator.is_valid? notification, mode = :local**
|
100
|
+
|
101
|
+
* **notification**: The POST params delivered by Khipu.
|
102
|
+
* **mode**: Whether the validation should be done at the **[:local](https://khipu.com/page/api#validacion-local)** or by **[:webservice](https://khipu.com/page/api#validacion-web-service)**.
|
103
|
+
|
104
|
+
# TODO:
|
105
|
+
|
106
|
+
## New Features
|
107
|
+
|
108
|
+
### khipu_button v2
|
109
|
+
**khipu_button subject, amount, options = {}, &block**
|
110
|
+
|
111
|
+
Options:
|
112
|
+
* **:hash_url**: if provided the hash won't be generated by default and upon submit, it will be requested.
|
113
|
+
* **:form_options**: html options for the form.
|
114
|
+
* **:button_options**: html options for the button.
|
115
|
+
|
116
|
+
Block
|
117
|
+
&block: If a block is given the helper will render it within the form. This can be usefull for further customization of the form.
|
118
|
+
|
119
|
+
**If the block contains a submit input, a button or an image input, it won't render the image input provided by the helper.**
|
120
|
+
|
121
|
+
### khipu_hash
|
122
|
+
**khipu_hash options = {}**
|
76
123
|
|
77
|
-
|
78
|
-
* **local_validation**: Wether the validation should be done at the [local machine](https://khipu.com/page/api#validacion-local) or by [Khipu's API](https://khipu.com/page/api#validacion-web-service).
|
124
|
+
Generator of the Khipu hash made public so you can include it in an action when **:hash_url** is given to the form.
|
79
125
|
|
80
126
|
## Contributing
|
81
127
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module KhipuRails
|
2
|
+
class KhipuController < KhipuRails::ApplicationController
|
3
|
+
def notification
|
4
|
+
@notification = {
|
5
|
+
api_version: params[:api_version],
|
6
|
+
receiver_id: params[:receiver_id],
|
7
|
+
notification_id: params[:notification_id],
|
8
|
+
subject: params[:subject],
|
9
|
+
amount: params[:amount],
|
10
|
+
currency: params[:currency],
|
11
|
+
transaction_id: params[:transaction_id],
|
12
|
+
payer_email: params[:payer_email],
|
13
|
+
custom: params[:custom],
|
14
|
+
notification_signature: params[:notification_signature]
|
15
|
+
}
|
16
|
+
|
17
|
+
valid = KhipuRails::NotificationValidator.is_valid?(@notification, :webservice)
|
18
|
+
# if valid
|
19
|
+
# else
|
20
|
+
# end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIFuDCCBSGgAwIBAgIQHCWU8WfzVpZq9iYPMgYpVzANBgkqhkiG9w0BAQUFADCB
|
3
|
+
0DEUMBIGA1UEChMLRS1TaWduIFMuQS4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0
|
4
|
+
IE5ldHdvcmsxODA2BgNVBAsTL1Rlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy5l
|
5
|
+
LXNpZ24uY2wvcnBhIChjKTA1MTwwOgYDVQQDEzNFLVNpZ24gU0MgQ2xhc3MgMiBD
|
6
|
+
b25zdW1lciBJbmRpdmlkdWFsIFN1YnNjcmliZXIgQ0ExHzAdBgkqhkiG9w0BCQEW
|
7
|
+
EGUtc2lnbkBlLXNpZ24uY2wwHhcNMTIxMTA3MDAwMDAwWhcNMTMxMTA3MjM1OTU5
|
8
|
+
WjCCAQgxMDAuBgNVBAsTJ1Rlcm1zIG9mIHVzZSBhdCB3d3cuZS1zaWduLmNsL3Jw
|
9
|
+
YSBDKDA0KTElMCMGA1UECxMcQXV0aGVudGljYXRlZCBieSBFLVNpZ24gUy5BLjEn
|
10
|
+
MCUGA1UECxMeTWVtYmVyLCBWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMRswGQYDVQQL
|
11
|
+
ExJEaWdpdGFsIElEIENsYXNzIDIxGDAWBgNVBAsUD1JVVCAtIDkxMjM4NDUtNDEl
|
12
|
+
MCMGA1UEAxMcUm9iZXJ0byBBbmRyZXMgT3Bhem8gR2F6bXVyaTEmMCQGCSqGSIb3
|
13
|
+
DQEJARYXcm9iZXJ0by5vcGF6b0BraGlwdS5jb20wggEiMA0GCSqGSIb3DQEBAQUA
|
14
|
+
A4IBDwAwggEKAoIBAQC4xI/f6C/5V/KsIAQY3G2ExoqIb8NoM7czRw9UNdx/OEiL
|
15
|
+
QJfqJjx1gVkcZxHqcWT6DENuf7H2LyYvzXOfeQgN5Zw8FCdIxjoF00AOIf3YDLdG
|
16
|
+
0IXoiRuZWPh9JkbGyl/tSd/fJWSh12GQAUE0m0YYMNHGiNPqiZ3jJEUgNWKjfO2D
|
17
|
+
xMqTGrujDnA3qF/2SiBrWRj5XyZCIYumrHWKGQnvmd6uaH4SOyaPc1Jl8byqfzg6
|
18
|
+
GlHX2hWyVJ2Tc+GHxAiSm8RzUfSAfgCbUm+/8gX0uDlGA7dqaa9FIZh7RWBdN4Nn
|
19
|
+
Dd9XHEOtXnBVL6mFzut57eAwEHz+a6tv2E2yy/GJAgMBAAGjggHSMIIBzjAiBgNV
|
20
|
+
HREEGzAZoBcGCCsGAQQBwQEBoAsWCTkxMjM4NDUtNDAJBgNVHRMEAjAAMAsGA1Ud
|
21
|
+
DwQEAwIFoDCBmQYDVR0gBIGRMIGOMIGLBgtghkgBhvhFAQcXAjB8MDEGCCsGAQUF
|
22
|
+
BwIBFiVodHRwczovL3d3dy5lLXNpZ24uY2wvcmVwb3NpdG9yaW8uaHRtMEcGCCsG
|
23
|
+
AQUFBwICMDsaOUNlcnRpZmljYWRvIHBhcmEgdXNvIFRyaWJ1dGFyaW8sIENvbWVy
|
24
|
+
Y2lvLCBQYWdvcyB5IE90cm9zLjAjBgNVHRIEHDAaoBgGCCsGAQQBwQECoAwWCjk5
|
25
|
+
NTUxNzQwLUswTQYDVR0fBEYwRDBCoECgPoY8aHR0cDovL29uc2l0ZWNybC52ZXJp
|
26
|
+
c2lnbi5jb20vRVNpZ25TQUNTQ0NsYXNzMi9MYXRlc3RDUkwuY3JsMDsGCCsGAQUF
|
27
|
+
BwEBBC8wLTArBggrBgEFBQcwAYYfaHR0cDovL29uc2l0ZS1vY3NwLnZlcmlzaWdu
|
28
|
+
LmNvbTAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwEQYJYIZIAYb4QgEB
|
29
|
+
BAQDAgeAMBEGCmCGSAGG+EUBBgkEAwEB/zANBgkqhkiG9w0BAQUFAAOBgQAFiXQz
|
30
|
+
K9TrKWkJH3is2H/QI8gynHQV71kvmSUnRgPk5TdXzd6EDhbaQMC3pCdwhpKKUfFo
|
31
|
+
0Ky8wtkagE8jdCRkpDfGpnhINfJZW9HH3gKe2zFckynPZcV5fsVM1tQzWQNBPaFf
|
32
|
+
scJQlyZrC17dCDWkJ2op67BRjp97skB1SUWtRw==
|
33
|
+
-----END CERTIFICATE-----
|
34
|
+
-----BEGIN CERTIFICATE-----
|
35
|
+
MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw
|
36
|
+
CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns
|
37
|
+
YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
|
38
|
+
MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y
|
39
|
+
aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe
|
40
|
+
Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX
|
41
|
+
MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj
|
42
|
+
IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx
|
43
|
+
KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
|
44
|
+
eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B
|
45
|
+
AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM
|
46
|
+
HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw
|
47
|
+
DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC
|
48
|
+
AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji
|
49
|
+
nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX
|
50
|
+
rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn
|
51
|
+
jBJ7xUS0rg==
|
52
|
+
-----END CERTIFICATE-----
|
53
|
+
-----BEGIN CERTIFICATE-----
|
54
|
+
MIIE+TCCBGKgAwIBAgIQKin05rwB5h97p8C1gITJ/TANBgkqhkiG9w0BAQUFADCB
|
55
|
+
wTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTwwOgYDVQQL
|
56
|
+
EzNDbGFzcyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
|
57
|
+
IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1
|
58
|
+
dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
|
59
|
+
cmswHhcNMDUwMTI2MDAwMDAwWhcNMTMxMjMxMjM1OTU5WjCB0DEUMBIGA1UEChML
|
60
|
+
RS1TaWduIFMuQS4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxODA2
|
61
|
+
BgNVBAsTL1Rlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy5lLXNpZ24uY2wvcnBh
|
62
|
+
IChjKTA1MTwwOgYDVQQDEzNFLVNpZ24gU0MgQ2xhc3MgMiBDb25zdW1lciBJbmRp
|
63
|
+
dmlkdWFsIFN1YnNjcmliZXIgQ0ExHzAdBgkqhkiG9w0BCQEWEGUtc2lnbkBlLXNp
|
64
|
+
Z24uY2wwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMbSfBEWnvbhoREERJlU
|
65
|
+
5SxH409463pkSrLlnGkgKBbt6shef4TWJoIKaPzpaXtU9Fly43U12MBPU4otfGkU
|
66
|
+
IDiaXnQY6yqVhJvTQg6NChYztY4XFvZAoHiJzFrD795YNXtoYA37u0KwbjRg35GC
|
67
|
+
cGuAwRUzq+khug6u4Ygt8VVnAgMBAAGjggHfMIIB2zAPBgNVHRMECDAGAQH/AgEA
|
68
|
+
MEEGA1UdIAQ6MDgwNgYLYIZIAYb4RQEHFwIwJzAlBggrBgEFBQcCARYZaHR0cHM6
|
69
|
+
Ly93d3cuZS1zaWduLmNsL3JwYTA0BgNVHR8ELTArMCmgJ6AlhiNodHRwOi8vY3Js
|
70
|
+
LnZlcmlzaWduLmNvbS9wY2EyLWcyLmNybDALBgNVHQ8EBAMCAQYwEQYJYIZIAYb4
|
71
|
+
QgEBBAQDAgEGMCUGA1UdEQQeMBykGjAYMRYwFAYDVQQDEw1BZmZpbGlhdGUxLTE1
|
72
|
+
MB0GA1UdDgQWBBSkk4EtStpWTpY7+B+Rgdeh8j2GrzCB6AYDVR0jBIHgMIHdoYHH
|
73
|
+
pIHEMIHBMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6
|
74
|
+
BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRo
|
75
|
+
b3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBG
|
76
|
+
b3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3Qg
|
77
|
+
TmV0d29ya4IRALkvYMyIn6F6Rgm4W3Bsiq8wDQYJKoZIhvcNAQEFBQADgYEAaeuM
|
78
|
+
S20zHfi83LtoyvH+nr54DcblrQWdrHj3MfyEOFEDsHiAgFtaHXqW9U0zKDpxt76b
|
79
|
+
Dx9MA2Gy/fU6BKal52yjMOAC8VOh+mT5Nd7zBwrKHddeftCvYTEGNabgfXyIpVVV
|
80
|
+
y/nIVbLsBOJjQDS1y/LR7GldVSqyX0W1yZYGwoo=
|
81
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,22 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDszCCApsCBFA88VcwDQYJKoZIhvcNAQEFBQAwgZ0xIDAeBgkqhkiG9w0BCQEW
|
3
|
+
EXJvYmVydG9Acm9wYXpvLmNsMQswCQYDVQQGEwJDTDERMA8GA1UECAwIU2FudGlh
|
4
|
+
Z28xCzAJBgNVBAcMAlJNMRIwEAYDVQQKDAlLaGlwdS5jb20xGDAWBgNVBAsMD0dl
|
5
|
+
cmVudGUgR2VuZXJhbDEeMBwGA1UEAwwVUm9iZXJ0byBPcGF6byBHYXptdXJpMB4X
|
6
|
+
DTEyMDgyODE2MjcwM1oXDTEzMDgyODE2MjcwM1owgZ0xIDAeBgkqhkiG9w0BCQEW
|
7
|
+
EXJvYmVydG9Acm9wYXpvLmNsMQswCQYDVQQGEwJDTDERMA8GA1UECAwIU2FudGlh
|
8
|
+
Z28xCzAJBgNVBAcMAlJNMRIwEAYDVQQKDAlLaGlwdS5jb20xGDAWBgNVBAsMD0dl
|
9
|
+
cmVudGUgR2VuZXJhbDEeMBwGA1UEAwwVUm9iZXJ0byBPcGF6byBHYXptdXJpMIIB
|
10
|
+
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk+0IYrfbAPSRSX8u3+js786J
|
11
|
+
QTMXGS52LUFHOKXokQbqfcbPs9qwBDr4NeRbM3GQ8CRLLM9PKenHbd93ErpY4GDC
|
12
|
+
CWZPU9RA4nFgJa/pJzFEf74dR0tQOnEdEDwCdlAp7EkVFIUnweSDG0QG9Dedvn/J
|
13
|
+
tlHMRM0NXQSq6NxFPzjTyK4/J5g86V9LPEt6h+TpQACKxGxKa9cDdt6n8wDhskwV
|
14
|
+
V6xiwkq+j+tNh5+DIdKstceG8UulgdpgTt9r7kr9FVwL1L3ugJ4zK1fGYbTwPQRu
|
15
|
+
H9C0y7vZ/Mjm/osv9BAm0r57ywVgPU6af2yrTMhMkuCkMrIq4qW0XDiCTiso8QID
|
16
|
+
AQABMA0GCSqGSIb3DQEBBQUAA4IBAQCO6do2tYvE5/nLYnPXQbpUhhJLvZbJd+Nl
|
17
|
+
jLUlju2yzgNLFA3g19t9uKxKRG497//WdxHoa3lAPnY8IO+DgKp5dOMcKLopz+AX
|
18
|
+
jsElzCQxcPNqlYwGQgEDDm9q0WXs1Dg22y0Af1oR5Lx9XR1xWsw4z/6YEDUJRa7D
|
19
|
+
fAUIip+ocbMykuUvnrNU/wUDRv8VbsIoMr+1CK3pKACSUuB8ZhYfRUjgHEXKh4O5
|
20
|
+
I/hKy49jGW/9i5GOTEGGzOvHm2CIrpBPFWfKSJLjvLtYWbBuCyKK5+FsP4wuN8Rv
|
21
|
+
yLM1MDg00bd5M5MmTA1FFNGiGUqpfo7z+kcqRFOJqWm7bmaDvZVJ
|
22
|
+
-----END CERTIFICATE-----
|
data/config/routes.rb
ADDED
data/khipu-rails.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |gem|
|
|
8
8
|
gem.version = KhipuRails::VERSION
|
9
9
|
gem.authors = ["Klaus Hott Vidal"]
|
10
10
|
gem.email = ["klahott@gmail.com"]
|
11
|
-
gem.description = %q{This gem provides
|
12
|
-
gem.summary = %q{
|
11
|
+
gem.description = %q{This gem provides an ActionView helper that creates a form following Khipu's documentation.}
|
12
|
+
gem.summary = %q{Wrapper for the Khipu api.}
|
13
13
|
gem.homepage = %q{https://github.com/janther/khipu-rails}
|
14
14
|
|
15
15
|
gem.files = `git ls-files`.split($/)
|
@@ -17,9 +17,11 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
18
|
gem.require_paths = ["lib"]
|
19
19
|
|
20
|
-
gem.add_dependency "rails", "
|
20
|
+
gem.add_dependency "rails", ">= 3.1"
|
21
|
+
gem.add_dependency "jquery-rails"
|
22
|
+
gem.add_dependency "nokogiri"
|
23
|
+
gem.add_dependency "httpclient"
|
21
24
|
|
22
25
|
gem.add_development_dependency "rspec-rails"
|
23
|
-
gem.add_development_dependency "nokogiri"
|
24
26
|
gem.add_development_dependency "capybara", "~> 1.1.2"
|
25
27
|
end
|
data/lib/khipu-rails.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require "khipu_rails"
|
3
3
|
require "khipu_rails/version"
|
4
|
+
require "khipu_rails/receiver"
|
4
5
|
require "khipu_rails/config"
|
5
6
|
require "khipu_rails/button_helper"
|
7
|
+
require "khipu_rails/notification_validator"
|
6
8
|
|
7
9
|
ActionView::Base.send :include, KhipuRails::ButtonHelper
|
data/lib/khipu_rails.rb
CHANGED
@@ -1,2 +1,61 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
module KhipuRails
|
2
|
-
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def configure
|
6
|
+
yield config
|
7
|
+
end
|
8
|
+
|
9
|
+
def config
|
10
|
+
@config ||= Config.default
|
11
|
+
end
|
12
|
+
|
13
|
+
attr_writer :config
|
14
|
+
|
15
|
+
def khipu_hash options = {}
|
16
|
+
options.reverse_merge! KhipuRails.config.button_defaults
|
17
|
+
|
18
|
+
receiver = load_receiver options
|
19
|
+
OpenSSL::HMAC.hexdigest('sha256', receiver.key, raw_hash(options, receiver))
|
20
|
+
end
|
21
|
+
|
22
|
+
def raw_hash options = {}, receiver = load_receiver(options)
|
23
|
+
options.reverse_merge! KhipuRails.config.button_defaults
|
24
|
+
|
25
|
+
raw = [
|
26
|
+
"receiver_id=#{receiver.id}",
|
27
|
+
"subject=#{options[:subject]}",
|
28
|
+
"body=#{options[:body]}",
|
29
|
+
"amount=#{options[:amount]}",
|
30
|
+
"payer_email=#{options[:payer_email]}",
|
31
|
+
"bank_id=#{options[:bank_id]}",
|
32
|
+
"expires_date=#{options[:expires_date]}",
|
33
|
+
"transaction_id=#{options[:transaction_id]}",
|
34
|
+
"custom=#{options[:custom]}",
|
35
|
+
"notify_url=#{options[:notify_url]}",
|
36
|
+
"return_url=#{options[:return_url]}",
|
37
|
+
"cancel_url=#{options[:cancel_url]}",
|
38
|
+
"picture_url=#{options[:picture_url]}"
|
39
|
+
].join('&')
|
40
|
+
|
41
|
+
raw
|
42
|
+
end
|
43
|
+
|
44
|
+
def root
|
45
|
+
File.expand_path '../..', __FILE__
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def load_receiver options
|
51
|
+
if options[:receiver_id].present?
|
52
|
+
if options[:secret].present?
|
53
|
+
KhipuRails::Receiver.new options[:receiver_id], options[:secret]
|
54
|
+
else
|
55
|
+
KhipuRails.config.receivers.find{|r| r.id == options[:receiver_id]}
|
56
|
+
end
|
57
|
+
else
|
58
|
+
KhipuRails.config.receivers.first
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -3,55 +3,66 @@ module KhipuRails
|
|
3
3
|
module ButtonHelper
|
4
4
|
def khipu_button subject, amount, options = {}
|
5
5
|
options.reverse_merge! body: '',
|
6
|
+
payer_email: '',
|
7
|
+
bank_id: '',
|
8
|
+
expires_date: '',
|
9
|
+
notify_url: '',
|
6
10
|
return_url: '',
|
7
11
|
cancel_url: '',
|
8
12
|
transaction_id: '',
|
9
|
-
payer_email: '',
|
10
13
|
picture_url: '',
|
11
14
|
custom: '',
|
12
|
-
button_image: '50x25',
|
13
|
-
receiver_id: KhipuRails
|
14
|
-
secret: KhipuRails::Config.api_key #Loads api key from configuration
|
15
|
+
button_image: '50x25', #Default Button Image
|
16
|
+
receiver_id: KhipuRails.config.receivers.first.id #Loads first receiver from configuration by default
|
15
17
|
|
16
|
-
options[:
|
17
|
-
options[:amount] = amount #Adds the amount param to the options for khipu_hash
|
18
|
+
button_image = KhipuRails.config.button_images()[options[:button_image]] || options[:button_image]
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
[].tap do |i|
|
23
|
-
i << hidden_field_tag(:receiver_id, options[:receiver_id])
|
20
|
+
form_tag 'https://khipu.com/api/1.3/createPaymentPage', authenticity_token: false do
|
21
|
+
fields = [].tap do |i|
|
22
|
+
i << hidden_field_tag(:receiver_id, options[:receiver_id])
|
24
23
|
i << hidden_field_tag(:subject, subject)
|
25
|
-
i << hidden_field_tag(:body,
|
26
|
-
i << hidden_field_tag(:amount,
|
27
|
-
i << hidden_field_tag(:
|
28
|
-
i << hidden_field_tag(:
|
29
|
-
i << hidden_field_tag(:
|
24
|
+
i << hidden_field_tag(:body, options[:body])
|
25
|
+
i << hidden_field_tag(:amount, amount)
|
26
|
+
i << hidden_field_tag(:payer_email, options[:payer_email])
|
27
|
+
i << hidden_field_tag(:bank_id, options[:bank_id])
|
28
|
+
i << hidden_field_tag(:expires_date, options[:expires_date])
|
30
29
|
i << hidden_field_tag(:transaction_id, options[:transaction_id])
|
31
|
-
i << hidden_field_tag(:
|
32
|
-
i << hidden_field_tag(:
|
33
|
-
i << hidden_field_tag(:
|
30
|
+
i << hidden_field_tag(:custom, options[:custom])
|
31
|
+
i << hidden_field_tag(:notify_url, options[:notify_url])
|
32
|
+
i << hidden_field_tag(:return_url, options[:return_url])
|
33
|
+
i << hidden_field_tag(:cancel_url, options[:cancel_url])
|
34
|
+
i << hidden_field_tag(:picture_url, options[:picture_url])
|
35
|
+
end.join.html_safe
|
36
|
+
|
37
|
+
ng = Nokogiri::HTML.parse fields
|
38
|
+
|
39
|
+
hash_fields = {
|
40
|
+
receiver_id: get_value(ng, :receiver_id),
|
41
|
+
subject: get_value(ng, :subject),
|
42
|
+
body: get_value(ng, :body),
|
43
|
+
amount: get_value(ng, :amount),
|
44
|
+
payer_email: get_value(ng, :payer_email),
|
45
|
+
bank_id: get_value(ng, :bank_id),
|
46
|
+
expires_date: get_value(ng, :expires_date),
|
47
|
+
transaction_id: get_value(ng, :transaction_id),
|
48
|
+
custom: get_value(ng, :custom),
|
49
|
+
notify_url: get_value(ng, :notify_url),
|
50
|
+
return_url: get_value(ng, :return_url),
|
51
|
+
cancel_url: get_value(ng, :cancel_url),
|
52
|
+
picture_url: get_value(ng, :picture_url),
|
53
|
+
secret: options[:secret]
|
54
|
+
}
|
55
|
+
|
56
|
+
[fields].tap do |i|
|
57
|
+
i << hidden_field_tag(:hash, KhipuRails.khipu_hash(hash_fields))
|
34
58
|
i << image_submit_tag(button_image, name: :submit)
|
35
59
|
end.join.html_safe
|
36
60
|
end
|
37
61
|
end
|
38
62
|
|
39
63
|
private
|
40
|
-
def
|
41
|
-
|
42
|
-
"receiver_id=#{options[:receiver_id]}",
|
43
|
-
"subject=#{options[:subject]}",
|
44
|
-
"body=#{options[:body]}",
|
45
|
-
"amount=#{options[:amount]}",
|
46
|
-
"return_url=#{options[:return_url]}",
|
47
|
-
"cancel_url=#{options[:cancel_url]}",
|
48
|
-
"custom=#{options[:custom]}",
|
49
|
-
"transaction_id=#{options[:transaction_id]}",
|
50
|
-
"picture_url=#{options[:picture_url]}",
|
51
|
-
"payer_email=#{options[:payer_email]}",
|
52
|
-
"secret=#{options[:secret]}"
|
53
|
-
].join('&')
|
54
|
-
Digest::SHA1.hexdigest raw
|
64
|
+
def get_value inputs, attribute
|
65
|
+
inputs.css("input[name=#{attribute}]").attribute('value').value
|
55
66
|
end
|
56
67
|
end
|
57
68
|
end
|