khipu-rails 0.0.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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**: 
|
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
|