gmo 0.5.3 → 0.5.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 887bfcdae8390b25695da4ef4277e17a3e7277e8e878305587696efdef422f8c
4
- data.tar.gz: 404db2e387cce32a9c373a56ffd645bd81ff4762369fd65fe8a5981f22279ce3
3
+ metadata.gz: a382627bdae7005db8cdb14727ad253739950a9b5134392dbcff019c3f85af80
4
+ data.tar.gz: b090836a299173cbd347378c3c7ddc09d460f93228e85d77a49913ad29c2efdf
5
5
  SHA512:
6
- metadata.gz: 8a40341d2e94063bab2b1471b845f30963303dad494272baf8617c7b01fbbcceeee9cff2308d6e96ac7970de1a2264e92eaeffc595c426d37be75d7270cccceb
7
- data.tar.gz: 8b1785be6e12079f3a9997794705cdd4700a3da0d826cd73c5781e47c958be011466627537ff7c0b992449aee2bc1500817937ca3671287e996d6370b6a8130f
6
+ metadata.gz: 9259cbed99b87ec9f436cd5e8675ef53597bf63291430f7e9456cf6d201f3f7dd9573061314e2495f1c6a9a737e49941df4150db650856f8c38c7c6b528c4d7d
7
+ data.tar.gz: 94b6ffeace738a1283b1be9674ca3366fe6fd99a5c03a0c5a4920fcf66311ead68f0c923a1eed806033094130c1e219ef14ce31768e62d7c082f612e42eaf4aa
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 0.5.4
4
+ * Support 銀行振込(バーチャル口座)決済, モバイルSuica, 楽天Edy決済 [#53](https://github.com/t-k/gmo-payment-ruby/pull/53) (Thanks [@valda](https://github.com/valda))
5
+ * Support 継続課金 [#31](https://github.com/t-k/gmo-payment-ruby/pull/31) (Thanks [@yalab](https://github.com/yalab))
6
+
3
7
  ## 0.5.3
4
8
  * Support 認証後決済実行 [#45](https://github.com/t-k/gmo-payment-ruby/pull/45) (Thanks [@darren987469](https://github.com/darren987469))
5
9
  * Support SearchType of INPUT_PARAMS [#47](https://github.com/t-k/gmo-payment-ruby/pull/47) (Thanks [@nkuroda](https://github.com/nkuroda))
@@ -0,0 +1,35 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://<HOST>/payment/EntryTranEdy.idPass
6
+ body:
7
+ encoding: UTF-8
8
+ string: OrderID=<TOKEN>662969828&Amount=<TOKEN>00&ShopID=<SHOP_ID>&ShopPass=<SHOP_PASS>
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=<TOKEN>.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - nginx
23
+ Date:
24
+ - Mon, <TOKEN>2 Sep 2022 08:03:49 GMT
25
+ Content-Type:
26
+ - text/plain;charset=Windows-3<TOKEN>J
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - close
31
+ body:
32
+ encoding: UTF-8
33
+ string: AccessID=63bff23f2cb9bfc9c528fd82f03<TOKEN>d04e&AccessPass=509ced83bb0acd48c958f3baff94452<TOKEN>
34
+ recorded_at: Mon, 12 Sep 2022 08:03:49 GMT
35
+ recorded_with: VCR 6.0.0
@@ -0,0 +1,35 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://<HOST>/payment/EntryTranSuica.idPass
6
+ body:
7
+ encoding: UTF-8
8
+ string: OrderID=<TOKEN>662969828&Amount=<TOKEN>00&ShopID=<SHOP_ID>&ShopPass=<SHOP_PASS>
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=<TOKEN>.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - nginx
23
+ Date:
24
+ - Mon, <TOKEN>2 Sep 2022 08:03:48 GMT
25
+ Content-Type:
26
+ - text/plain;charset=Windows-3<TOKEN>J
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - close
31
+ body:
32
+ encoding: UTF-8
33
+ string: AccessID=63bff23f2cb9bfc9c528fd82f03<TOKEN>d04e&AccessPass=4737074<TOKEN>2<TOKEN>9075004e2a4f74fbca48db
34
+ recorded_at: Mon, 12 Sep 2022 08:03:48 GMT
35
+ recorded_with: VCR 6.0.0
@@ -0,0 +1,35 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://<HOST>/payment/EntryTranVirtualaccount.idPass
6
+ body:
7
+ encoding: UTF-8
8
+ string: OrderID=<TOKEN>66262<TOKEN>284&Amount=<TOKEN>00&ShopID=<SHOP_ID>&ShopPass=<SHOP_PASS>
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=<TOKEN>.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - nginx
23
+ Date:
24
+ - Thu, 08 Sep 2022 07:<TOKEN>4:44 GMT
25
+ Content-Type:
26
+ - text/plain;charset=Windows-3<TOKEN>J
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - close
31
+ body:
32
+ encoding: UTF-8
33
+ string: OrderID=<TOKEN>66262<TOKEN>284&AccessID=672560ef8bfede4aece2bdd43a66dd59&AccessPass=b436e6b362b89c622<TOKEN>f266be<TOKEN>43<TOKEN>b290
34
+ recorded_at: Thu, 08 Sep 2022 07:14:44 GMT
35
+ recorded_with: VCR 6.0.0
@@ -0,0 +1,67 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://<HOST>/payment/EntryTranEdy.idPass
6
+ body:
7
+ encoding: UTF-8
8
+ string: OrderID=<TOKEN>662970040&Amount=<TOKEN>00&ShopID=<SHOP_ID>&ShopPass=<SHOP_PASS>
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=<TOKEN>.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - nginx
23
+ Date:
24
+ - Mon, <TOKEN>2 Sep 2022 08:07:20 GMT
25
+ Content-Type:
26
+ - text/plain;charset=Windows-3<TOKEN>J
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - close
31
+ body:
32
+ encoding: UTF-8
33
+ string: AccessID=<TOKEN>e85e402df4ae23036f6de940c4eb2d7&AccessPass=<TOKEN>6440b8df892<TOKEN>f<TOKEN>0a2dba3<TOKEN>cb2<TOKEN>03805
34
+ recorded_at: Mon, 12 Sep 2022 08:07:20 GMT
35
+ - request:
36
+ method: post
37
+ uri: https://<HOST>/payment/ExecTranEdy.idPass
38
+ body:
39
+ encoding: UTF-8
40
+ string: OrderID=<TOKEN>662970040&AccessID=<TOKEN>e85e402df4ae23036f6de940c4eb2d7&AccessPass=<TOKEN>6440b8df892<TOKEN>f<TOKEN>0a2dba3<TOKEN>cb2<TOKEN>03805&MailAddress=test%40example.com&ClientField<TOKEN>=client_field<TOKEN>&ClientFieldFlag=<TOKEN>&ShopID=<SHOP_ID>&ShopPass=<SHOP_PASS>
41
+ headers:
42
+ Accept-Encoding:
43
+ - gzip;q=<TOKEN>.0,deflate;q=0.6,identity;q=0.3
44
+ Accept:
45
+ - "*/*"
46
+ User-Agent:
47
+ - Ruby
48
+ response:
49
+ status:
50
+ code: 200
51
+ message: OK
52
+ headers:
53
+ Server:
54
+ - nginx
55
+ Date:
56
+ - Mon, <TOKEN>2 Sep 2022 08:07:23 GMT
57
+ Content-Type:
58
+ - text/plain;charset=Windows-3<TOKEN>J
59
+ Transfer-Encoding:
60
+ - chunked
61
+ Connection:
62
+ - close
63
+ body:
64
+ encoding: UTF-8
65
+ string: OrderID=<TOKEN>662970040&ReceiptNo=EDY<TOKEN>662970042705&EdyOrderNo=<TOKEN>662970040-2209<TOKEN>204852<TOKEN>&PaymentTerm=20220922<TOKEN>70722&TranDate=202209<TOKEN>2<TOKEN>70722&CheckString=8db002858a8d3b8<TOKEN>eaf4b3<TOKEN>e7a2c<TOKEN>d20&ClientField<TOKEN>=client_field<TOKEN>&ClientField2=&ClientField3=
66
+ recorded_at: Mon, 12 Sep 2022 08:07:23 GMT
67
+ recorded_with: VCR 6.0.0
@@ -0,0 +1,67 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://<HOST>/payment/EntryTranSuica.idPass
6
+ body:
7
+ encoding: UTF-8
8
+ string: OrderID=<TOKEN>662969936&Amount=<TOKEN>00&ShopID=<SHOP_ID>&ShopPass=<SHOP_PASS>
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=<TOKEN>.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - nginx
23
+ Date:
24
+ - Mon, <TOKEN>2 Sep 2022 08:05:37 GMT
25
+ Content-Type:
26
+ - text/plain;charset=Windows-3<TOKEN>J
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - close
31
+ body:
32
+ encoding: UTF-8
33
+ string: AccessID=288a3a<TOKEN>5032a<TOKEN>25e723dad49<TOKEN>5d3b28a&AccessPass=d2dea7b2b94eab5ab3bddcfbd9cf58bc
34
+ recorded_at: Mon, 12 Sep 2022 08:05:37 GMT
35
+ - request:
36
+ method: post
37
+ uri: https://<HOST>/payment/ExecTranSuica.idPass
38
+ body:
39
+ encoding: UTF-8
40
+ string: OrderID=<TOKEN>662969936&AccessID=288a3a<TOKEN>5032a<TOKEN>25e723dad49<TOKEN>5d3b28a&AccessPass=d2dea7b2b94eab5ab3bddcfbd9cf58bc&ItemName=%8Dw%93%FC%82%B7%82%E9%8F%A4%95i%96%BC&MailAddress=test%40example.com&ClientField<TOKEN>=client_field<TOKEN>&ClientFieldFlag=<TOKEN>&ShopID=<SHOP_ID>&ShopPass=<SHOP_PASS>
41
+ headers:
42
+ Accept-Encoding:
43
+ - gzip;q=<TOKEN>.0,deflate;q=0.6,identity;q=0.3
44
+ Accept:
45
+ - "*/*"
46
+ User-Agent:
47
+ - Ruby
48
+ response:
49
+ status:
50
+ code: 200
51
+ message: OK
52
+ headers:
53
+ Server:
54
+ - nginx
55
+ Date:
56
+ - Mon, <TOKEN>2 Sep 2022 08:05:39 GMT
57
+ Content-Type:
58
+ - text/plain;charset=Windows-3<TOKEN>J
59
+ Transfer-Encoding:
60
+ - chunked
61
+ Connection:
62
+ - close
63
+ body:
64
+ encoding: UTF-8
65
+ string: OrderID=<TOKEN>662969936&SuicaOrderNo=<TOKEN>662969936-2209<TOKEN>2052836&ReceiptNo=SCA93925<TOKEN>&PaymentTerm=20220922<TOKEN>70637&TranDate=202209<TOKEN>2<TOKEN>70539&CheckString=d<TOKEN>fca947cffe2aa892<TOKEN>7f3fcbb403d02&ClientField<TOKEN>=client_field<TOKEN>&ClientField2=&ClientField3=
66
+ recorded_at: Mon, 12 Sep 2022 08:05:39 GMT
67
+ recorded_with: VCR 6.0.0
@@ -0,0 +1,68 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://<HOST>/payment/EntryTranVirtualaccount.idPass
6
+ body:
7
+ encoding: UTF-8
8
+ string: OrderID=<TOKEN>66262<TOKEN>552&Amount=<TOKEN>00&ShopID=<SHOP_ID>&ShopPass=<SHOP_PASS>
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=<TOKEN>.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - nginx
23
+ Date:
24
+ - Thu, 08 Sep 2022 07:<TOKEN>9:<TOKEN>3 GMT
25
+ Content-Type:
26
+ - text/plain;charset=Windows-3<TOKEN>J
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - close
31
+ body:
32
+ encoding: UTF-8
33
+ string: OrderID=<TOKEN>66262<TOKEN>552&AccessID=dda76d2bb678f82<TOKEN>ad3e4a7ded59d5b0&AccessPass=fdeccc446bb3320f48259062055ad926
34
+ recorded_at: Thu, 08 Sep 2022 07:19:13 GMT
35
+ - request:
36
+ method: post
37
+ uri: https://<HOST>/payment/ExecTranVirtualaccount.idPass
38
+ body:
39
+ encoding: UTF-8
40
+ string: OrderID=<TOKEN>66262<TOKEN>552&AccessID=dda76d2bb678f82<TOKEN>ad3e4a7ded59d5b0&AccessPass=fdeccc446bb3320f48259062055ad926&TradeDays=<TOKEN>4&ShopID=<SHOP_ID>&ShopPass=<SHOP_PASS>
41
+ headers:
42
+ Accept-Encoding:
43
+ - gzip;q=<TOKEN>.0,deflate;q=0.6,identity;q=0.3
44
+ Accept:
45
+ - "*/*"
46
+ User-Agent:
47
+ - Ruby
48
+ response:
49
+ status:
50
+ code: 200
51
+ message: OK
52
+ headers:
53
+ Server:
54
+ - nginx
55
+ Date:
56
+ - Thu, 08 Sep 2022 07:<TOKEN>9:<TOKEN>3 GMT
57
+ Content-Type:
58
+ - text/plain;charset=Windows-3<TOKEN>J
59
+ Transfer-Encoding:
60
+ - chunked
61
+ Connection:
62
+ - close
63
+ body:
64
+ encoding: ASCII-8BIT
65
+ string: !binary |-
66
+ QWNjZXNzSUQ9ZGRhNzZkMmJiNjc4ZjgyPFRPS0VOPmFkM2U0YTdkZWQ1OWQ1YjAmQmFua0NvZGU9OTk5OCZCYW5rTmFtZT2DZYNYg2eL4o1zJkJyYW5jaENvZGU9OTk5JkJyYW5jaE5hbWU9g2WDWINnjniTWCZBY2NvdW50VHlwZT08VE9LRU4+JkFjY291bnROdW1iZXI9PFRPS0VOPjAyOTMyOSZBdmFpbGFibGVEYXRlPTIwMjIwOTIyJlRyYWRlQ29kZT00MjY8VE9LRU4+PFRPS0VOPjM4
67
+ recorded_at: Thu, 08 Sep 2022 07:19:13 GMT
68
+ recorded_with: VCR 6.0.0
@@ -0,0 +1,36 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://<HOST>/payment/RegisterRecurringCredit.idPass
6
+ body:
7
+ encoding: UTF-8
8
+ string: RecurringID=<TOKEN>53596492<TOKEN>&Amount=<TOKEN>00&ChargeDay=3<TOKEN>&RegistType=<TOKEN>&MemberID=smama_development_user_<TOKEN>&SiteID=<SITE_ID>&SitePass=<SITE_PASS>&ShopID=<SHOP_ID>&ShopPass=<SHOP_PASS>
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=<TOKEN>.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - nginx
23
+ Date:
24
+ - Mon, 03 Sep 20<TOKEN>8 08:55:2<TOKEN> GMT
25
+ Content-Type:
26
+ - text/plain;charset=Windows-3<TOKEN>J
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - close
31
+ body:
32
+ encoding: UTF-8
33
+ string: ShopID=<SHOP_ID>&RecurringID=<TOKEN>53596492<TOKEN>&Amount=<TOKEN>00&Tax=0&ChargeDay=3<TOKEN>&ChargeMonth=0<TOKEN>|02|03|04|05|06|07|08|09|<TOKEN>0|<TOKEN><TOKEN>|<TOKEN>2&ChargeStartDate=20<TOKEN>80904&ChargeStopDate=&NextChargeDate=20<TOKEN>80930&Method=RECURRING_CREDIT&CardNo=&Expire=&SiteID=<SITE_ID>&MemberID=smama_development_user_<TOKEN>
34
+ http_version:
35
+ recorded_at: Mon, 03 Sep 2018 08:55:22 GMT
36
+ recorded_with: VCR 4.0.0
@@ -0,0 +1,69 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://<HOST>/payment/RegisterRecurringCredit.idPass
6
+ body:
7
+ encoding: UTF-8
8
+ string: RecurringID=<TOKEN>536039393&Amount=<TOKEN>00&ChargeDay=3<TOKEN>&RegistType=<TOKEN>&MemberID=smama_development_user_<TOKEN>&SiteID=<SITE_ID>&SitePass=<SITE_PASS>&ShopID=<SHOP_ID>&ShopPass=<SHOP_PASS>
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=<TOKEN>.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - nginx
23
+ Date:
24
+ - Tue, 04 Sep 20<TOKEN>8 05:36:34 GMT
25
+ Content-Type:
26
+ - text/plain;charset=Windows-3<TOKEN>J
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - close
31
+ body:
32
+ encoding: UTF-8
33
+ string: ShopID=<SHOP_ID>&RecurringID=<TOKEN>536039393&Amount=<TOKEN>00&Tax=0&ChargeDay=3<TOKEN>&ChargeMonth=0<TOKEN>|02|03|04|05|06|07|08|09|<TOKEN>0|<TOKEN><TOKEN>|<TOKEN>2&ChargeStartDate=20<TOKEN>80905&ChargeStopDate=&NextChargeDate=20<TOKEN>80930&Method=RECURRING_CREDIT&CardNo=&Expire=&SiteID=<SITE_ID>&MemberID=smama_development_user_<TOKEN>
34
+ http_version:
35
+ recorded_at: Tue, 04 Sep 2018 05:36:34 GMT
36
+ - request:
37
+ method: post
38
+ uri: https://<HOST>/payment/UnregisterRecurring.idPass
39
+ body:
40
+ encoding: UTF-8
41
+ string: RecurringID=<TOKEN>536039393&SiteID=<SITE_ID>&SitePass=<SITE_PASS>&ShopID=<SHOP_ID>&ShopPass=<SHOP_PASS>
42
+ headers:
43
+ Accept-Encoding:
44
+ - gzip;q=<TOKEN>.0,deflate;q=0.6,identity;q=0.3
45
+ Accept:
46
+ - "*/*"
47
+ User-Agent:
48
+ - Ruby
49
+ response:
50
+ status:
51
+ code: 200
52
+ message: OK
53
+ headers:
54
+ Server:
55
+ - nginx
56
+ Date:
57
+ - Tue, 04 Sep 20<TOKEN>8 05:36:34 GMT
58
+ Content-Type:
59
+ - text/plain;charset=Windows-3<TOKEN>J
60
+ Transfer-Encoding:
61
+ - chunked
62
+ Connection:
63
+ - close
64
+ body:
65
+ encoding: UTF-8
66
+ string: ShopID=<SHOP_ID>&RecurringID=<TOKEN>536039393&Amount=<TOKEN>00&Tax=0&ChargeDay=3<TOKEN>&ChargeMonth=0<TOKEN>|02|03|04|05|06|07|08|09|<TOKEN>0|<TOKEN><TOKEN>|<TOKEN>2&ChargeStartDate=20<TOKEN>80905&ChargeStopDate=&NextChargeDate=&Method=RECURRING_CREDIT&CardNo=&Expire=&SiteID=<SITE_ID>&MemberID=smama_development_user_<TOKEN>&PrintStr=
67
+ http_version:
68
+ recorded_at: Tue, 04 Sep 2018 05:36:34 GMT
69
+ recorded_with: VCR 4.0.0
data/lib/gmo/const.rb CHANGED
@@ -14,6 +14,12 @@ module GMO
14
14
  apple_pay: 'APay'
15
15
  }.freeze
16
16
 
17
+ RECURRING_REGIST_TYPE = {
18
+ member_id: '1',
19
+ card_number: '2',
20
+ order_id: '3'
21
+ }
22
+
17
23
  INPUT_PARAMS = {
18
24
  :access_id => "AccessID",
19
25
  :access_pass => "AccessPass",
@@ -38,6 +44,10 @@ module GMO
38
44
  :card_no => "CardNo",
39
45
  :card_pass => "CardPass",
40
46
  :card_seq => "CardSeq",
47
+ :charge_day => "ChargeDay",
48
+ :charge_month => "ChargeMonth",
49
+ :charge_start_date => "ChargeStartDate",
50
+ :charge_stop_date => "ChargeStopDate",
41
51
  :client_field_1 => "ClientField1",
42
52
  :client_field_2 => "ClientField2",
43
53
  :client_field_3 => "ClientField3",
@@ -102,7 +112,9 @@ module GMO
102
112
  :receipts_disp_11 => "ReceiptsDisp11",
103
113
  :receipts_disp_12 => "ReceiptsDisp12",
104
114
  :receipts_disp_13 => "ReceiptsDisp13",
115
+ :recurring_id => "RecurringID",
105
116
  :redirect_url => "RedirectURL",
117
+ :regist_type => "RegistType",
106
118
  :register_disp_1 => "RegisterDisp1",
107
119
  :register_disp_2 => "RegisterDisp2",
108
120
  :register_disp_3 => "RegisterDisp3",
@@ -122,6 +134,7 @@ module GMO
122
134
  :shop_pass => "ShopPass",
123
135
  :site_id => "SiteID",
124
136
  :site_pass => "SitePass",
137
+ :src_order_id => "SrcOrderID",
125
138
  :suica_add_info_1 => "SuicaAddInfo1",
126
139
  :suica_add_info_2 => "SuicaAddInfo2",
127
140
  :suica_add_info_3 => "SuicaAddInfo3",
@@ -141,7 +154,11 @@ module GMO
141
154
  :lang_cd => "LangCd",
142
155
  :user_info => "UserInfo",
143
156
  :package_name => "PackageName",
144
- :search_type => "SearchType"
157
+ :search_type => "SearchType",
158
+ :trade_days => "TradeDays",
159
+ :trade_reason => "TradeReason",
160
+ :trade_client_name => "TradeClientName",
161
+ :trade_client_mail_address => "TradeClientMailAddress"
145
162
  }.freeze
146
163
 
147
164
  API_ERROR_MESSAGES_EN = {
@@ -103,6 +103,96 @@ module GMO
103
103
  post_request name, options
104
104
  end
105
105
 
106
+ ### @params ###
107
+ # ShopID
108
+ # ShopPass
109
+ # RecurringID
110
+ # Amount
111
+ # Tax
112
+ # ChargeDay
113
+ # ChargeMonth
114
+ # ChargeStartDate
115
+ # ChargeStopDate
116
+ # RegistType
117
+ # SiteID
118
+ # SitePass
119
+ # MemberID
120
+ # CardNo
121
+ # Expire
122
+ # SrcOrderID
123
+ # ClientField1
124
+ # ClientField2
125
+ # ClientField3
126
+ ### @return ###
127
+ # ShopID
128
+ # RecurringID
129
+ # Amount
130
+ # Tax
131
+ # ChargeDay
132
+ # ChargeMonth
133
+ # ChargeStartDate
134
+ # ChargeStopDate
135
+ # NextChargeDate
136
+ # Method
137
+ ### example ###
138
+ # gmo.register_recurring_credit({
139
+ # recurring_id: "1535964921",
140
+ # amount: 100,
141
+ # regist_type: GMO::Const::RECURRING_REGIST_TYPE[:member_id],
142
+ # member_id: "mem10001"
143
+ # })
144
+ # => {"ShopID"=>"tshop0001", "RecurringID"=>"1535964921", "Amount"=>"100", "Tax"=>"0", "ChargeDay"=>"31", "ChargeMonth"=>"01|02|03|04|05|06|07|08|09|10|11|12", "ChargeStartDate"=>"20180904", "ChargeStopDate"=>"", "NextChargeDate"=>"20180930", "Method"=>"RECURRING_CREDIT", "CardNo"=>"", "Expire"=>"", "SiteID"=>"", "MemberID"=>"mem1001"}
145
+ def register_recurring_credit(options = {})
146
+ name = "RegisterRecurringCredit.idPass"
147
+ required = [:recurring_id, :charge_day, :amount, :regist_type]
148
+ required += case options[:regist_type].to_i
149
+ when 1
150
+ options.update(site_id: @site_id, site_pass: @site_pass)
151
+ [:member_id]
152
+ when 2
153
+ [:card_no, :expire]
154
+ when 3
155
+ [:src_order_id]
156
+ end
157
+ assert_required_options(required, options)
158
+ post_request name, options
159
+ end
160
+
161
+ ### @params ###
162
+ # ShopID
163
+ # ShopPass
164
+ # RecurringID
165
+ ### @return ###
166
+ # ShopID
167
+ # RecurringID
168
+ # Amount
169
+ # Tax
170
+ # ChargeDay
171
+ # ChargeMonth
172
+ # ChargeStartDate
173
+ # ChargeStopDate
174
+ # NextChargeDate
175
+ # Method
176
+ # SiteID
177
+ # MemberID
178
+ # CardNo
179
+ # Expire
180
+ # PrintStr
181
+ # ErrCode
182
+ # ErrInfo
183
+ ### example ###
184
+ # gmo.unregister_recurring({
185
+ # recurring_id: "1535964921"
186
+ # })
187
+ # => {"ShopID"=>"tshop0001", "RecurringID"=>"1536039145", "Amount"=>"100", "Tax"=>"0", "ChargeDay"=>"31", "ChargeMonth"=>"01|02|03|04|05|06|07|08|09|10|11|12", "ChargeStartDate"=>"20180905", "ChargeStopDate"=>"", "NextChargeDate"=>"", "Method"=>"RECURRING_CREDIT", "CardNo"=>"", "Expire"=>"", "SiteID"=>"tsite0001", "MemberID"=>"mem1001", "PrintStr"=>""}
188
+ def unregister_recurring(options = {})
189
+ name = "UnregisterRecurring.idPass"
190
+ options.merge!(site_id: @site_id, site_pass: @site_pass)
191
+ required = [:recurring_id]
192
+ assert_required_options(required, options)
193
+ post_request name, options
194
+ end
195
+
106
196
  private
107
197
 
108
198
  def api_call(name, args = {}, verb = "post", options = {})
data/lib/gmo/shop_api.rb CHANGED
@@ -158,6 +158,69 @@ module GMO
158
158
  post_request name, options
159
159
  end
160
160
 
161
+ ### @params ###
162
+ # OrderID
163
+ # Amount
164
+ # Tax
165
+ ### @return ###
166
+ # AccessID
167
+ # AccessPass
168
+ ### example ###
169
+ # gmo.entry_tran_virtualaccount({
170
+ # order_id: "ord12345",
171
+ # tax: "0001001",
172
+ # amount: 100
173
+ # })
174
+ # => {"AccessID"=>"139f8ec33a07c55f406937c52ce4473d", "AccessPass"=>"2689b204d2c17192fa35f9269fa7e744"}
175
+ def entry_tran_virtualaccount(options = {})
176
+ name = "EntryTranVirtualaccount.idPass"
177
+ required = [:order_id, :amount]
178
+ assert_required_options(required, options)
179
+ post_request name, options
180
+ end
181
+
182
+ ### @params ###
183
+ # OrderID
184
+ # Amount
185
+ # Tax
186
+ ### @return ###
187
+ # AccessID
188
+ # AccessPass
189
+ ### example ###
190
+ # gmo.entry_tran_suica({
191
+ # order_id: "ord12345",
192
+ # tax: "0001001",
193
+ # amount: 100
194
+ # })
195
+ # => {"AccessID"=>"139f8ec33a07c55f406937c52ce4473d", "AccessPass"=>"2689b204d2c17192fa35f9269fa7e744"}
196
+ def entry_tran_suica(options = {})
197
+ name = "EntryTranSuica.idPass"
198
+ required = [:order_id, :amount]
199
+ assert_required_options(required, options)
200
+ post_request name, options
201
+ end
202
+
203
+ ### @params ###
204
+ # OrderID
205
+ # Amount
206
+ # Tax
207
+ ### @return ###
208
+ # AccessID
209
+ # AccessPass
210
+ ### example ###
211
+ # gmo.entry_tran_edy({
212
+ # order_id: "ord12345",
213
+ # tax: "0001001",
214
+ # amount: 100
215
+ # })
216
+ # => {"AccessID"=>"139f8ec33a07c55f406937c52ce4473d", "AccessPass"=>"2689b204d2c17192fa35f9269fa7e744"}
217
+ def entry_tran_edy(options = {})
218
+ name = "EntryTranEdy.idPass"
219
+ required = [:order_id, :amount]
220
+ assert_required_options(required, options)
221
+ post_request name, options
222
+ end
223
+
161
224
  ## 2.2.2.2.決済実行
162
225
  # 指定されたサイトに会員を登録します。
163
226
  # return
@@ -286,6 +349,33 @@ module GMO
286
349
  post_request name, options
287
350
  end
288
351
 
352
+ # 【銀行振込(バーチャル口座)決済】
353
+ # 18.1.2.2. 決済実行
354
+ def exec_tran_virtualaccount(options = {})
355
+ name = "ExecTranVirtualaccount.idPass"
356
+ required = [:access_id, :access_pass, :order_id, :trade_days]
357
+ assert_required_options(required, options)
358
+ post_request name, options
359
+ end
360
+
361
+ # 【モバイルSuica決済】
362
+ # 18.1.2.2. 決済実行
363
+ def exec_tran_suica(options = {})
364
+ name = "ExecTranSuica.idPass"
365
+ required = [:access_id, :access_pass, :order_id, :item_name, :mail_address]
366
+ assert_required_options(required, options)
367
+ post_request name, options
368
+ end
369
+
370
+ # 【楽天Edy決済】
371
+ # 18.1.2.2. 決済実行
372
+ def exec_tran_edy(options = {})
373
+ name = "ExecTranEdy.idPass"
374
+ required = [:access_id, :access_pass, :order_id, :mail_address]
375
+ assert_required_options(required, options)
376
+ post_request name, options
377
+ end
378
+
289
379
  ### @params ###
290
380
  # AccessID
291
381
  # AccessPass
data/lib/gmo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module GMO
2
- VERSION = "0.5.3"
2
+ VERSION = "0.5.4"
3
3
  end
@@ -171,4 +171,28 @@ describe "GMO::Payment::ShopAndSiteAPI" do
171
171
  end
172
172
  end
173
173
 
174
+ describe "#register_recurring_credit" do
175
+ it "got data", :vcr do
176
+ recurring_id = generate_id
177
+ member_id = 'mem1001'
178
+ result = @service.register_recurring_credit({
179
+ :recurring_id => recurring_id,
180
+ :amount => 100,
181
+ :charge_day => 31,
182
+ :regist_type => GMO::Const::RECURRING_REGIST_TYPE[:member_id],
183
+ :member_id => member_id,
184
+ })
185
+ result["NextChargeDate"].nil?.should_not be true
186
+ end
187
+ end
188
+
189
+ describe "#unregister_recurring" do
190
+ it "success unregister", :vcr do
191
+ recurring_id = generate_id
192
+ result = @service.unregister_recurring({
193
+ recurring_id: recurring_id
194
+ })
195
+ result["Method"].should == "RECURRING_CREDIT"
196
+ end
197
+ end
174
198
  end
@@ -174,6 +174,60 @@ describe "GMO::Payment::ShopAPI" do
174
174
  end
175
175
  end
176
176
 
177
+ describe "#entry_tran_virtualaccount" do
178
+ it "gets data about a transaction", :vcr do
179
+ order_id = @order_id
180
+ result = @service.entry_tran_virtualaccount({
181
+ :order_id => order_id,
182
+ :amount => 100
183
+ })
184
+ result["AccessID"].nil?.should_not be true
185
+ result["AccessPass"].nil?.should_not be true
186
+ end
187
+
188
+ it "got error if missing options", :vcr do
189
+ lambda {
190
+ result = @service.entry_tran_virtualaccount()
191
+ }.should raise_error('Required order_id, amount were not provided.')
192
+ end
193
+ end
194
+
195
+ describe "#entry_tran_suica" do
196
+ it "gets data about a transaction", :vcr do
197
+ order_id = @order_id
198
+ result = @service.entry_tran_suica({
199
+ :order_id => order_id,
200
+ :amount => 100
201
+ })
202
+ result["AccessID"].nil?.should_not be true
203
+ result["AccessPass"].nil?.should_not be true
204
+ end
205
+
206
+ it "got error if missing options", :vcr do
207
+ lambda {
208
+ result = @service.entry_tran_suica()
209
+ }.should raise_error('Required order_id, amount were not provided.')
210
+ end
211
+ end
212
+
213
+ describe "#entry_tran_edy" do
214
+ it "gets data about a transaction", :vcr do
215
+ order_id = @order_id
216
+ result = @service.entry_tran_edy({
217
+ :order_id => order_id,
218
+ :amount => 100
219
+ })
220
+ result["AccessID"].nil?.should_not be true
221
+ result["AccessPass"].nil?.should_not be true
222
+ end
223
+
224
+ it "got error if missing options", :vcr do
225
+ lambda {
226
+ result = @service.entry_tran_edy()
227
+ }.should raise_error('Required order_id, amount were not provided.')
228
+ end
229
+ end
230
+
177
231
  describe "#exec_tran" do
178
232
  it "gets data about a transaction", :vcr do
179
233
  order_id = generate_id
@@ -470,6 +524,110 @@ describe "GMO::Payment::ShopAPI" do
470
524
  end
471
525
  end
472
526
 
527
+ describe "#exec_tran_virtualaccount" do
528
+ it "gets data about a transaction", :vcr do
529
+ order_id = generate_id
530
+ result = @service.entry_tran_virtualaccount({
531
+ :order_id => order_id,
532
+ :amount => 100
533
+ })
534
+ access_id = result["AccessID"]
535
+ access_pass = result["AccessPass"]
536
+ result = @service.exec_tran_virtualaccount({
537
+ :order_id => order_id,
538
+ :access_id => access_id,
539
+ :access_pass => access_pass,
540
+ :trade_days => 14
541
+ })
542
+ result["AccessID"].nil?.should_not be_truthy
543
+ result["BankCode"].nil?.should_not be_truthy
544
+ result["BankName"].nil?.should_not be_truthy
545
+ result["BranchCode"].nil?.should_not be_truthy
546
+ result["BranchName"].nil?.should_not be_truthy
547
+ result["AccountType"].nil?.should_not be_truthy
548
+ result["AccountNumber"].nil?.should_not be_truthy
549
+ result["AvailableDate"].nil?.should_not be_truthy
550
+ result["TradeCode"].nil?.should_not be_truthy
551
+ end
552
+
553
+ it "got error if missing options", :vcr do
554
+ lambda {
555
+ result = @service.exec_tran_virtualaccount()
556
+ }.should raise_error("Required access_id, access_pass, order_id, trade_days were not provided.")
557
+ end
558
+ end
559
+
560
+ describe "#exec_tran_suica" do
561
+ it "gets data about a transaction", :vcr do
562
+ order_id = generate_id
563
+ client_field_1 = "client_field1"
564
+ result = @service.entry_tran_suica({
565
+ :order_id => order_id,
566
+ :amount => 100
567
+ })
568
+ access_id = result["AccessID"]
569
+ access_pass = result["AccessPass"]
570
+ result = @service.exec_tran_suica({
571
+ :order_id => order_id,
572
+ :access_id => access_id,
573
+ :access_pass => access_pass,
574
+ :item_name => '購入する商品名',
575
+ :mail_address => 'test@example.com',
576
+ :client_field_1 => client_field_1,
577
+ :client_field_flg => 1
578
+ })
579
+ result["OrderID"].nil?.should_not be_truthy
580
+ result["SuicaOrderNo"].nil?.should_not be_truthy
581
+ result["ReceiptNo"].nil?.should_not be_truthy
582
+ result["PaymentTerm"].nil?.should_not be_truthy
583
+ result["TranDate"].nil?.should_not be_truthy
584
+ result["CheckString"].nil?.should_not be_truthy
585
+ (result["ClientField1"] == client_field_1).should be_truthy
586
+ result["ClientField3"].nil?.should_not be_truthy
587
+ end
588
+
589
+ it "got error if missing options", :vcr do
590
+ lambda {
591
+ result = @service.exec_tran_suica()
592
+ }.should raise_error("Required access_id, access_pass, order_id, item_name, mail_address were not provided.")
593
+ end
594
+ end
595
+
596
+ describe "#exec_tran_edy" do
597
+ it "gets data about a transaction", :vcr do
598
+ order_id = generate_id
599
+ client_field_1 = "client_field1"
600
+ result = @service.entry_tran_edy({
601
+ :order_id => order_id,
602
+ :amount => 100
603
+ })
604
+ access_id = result["AccessID"]
605
+ access_pass = result["AccessPass"]
606
+ result = @service.exec_tran_edy({
607
+ :order_id => order_id,
608
+ :access_id => access_id,
609
+ :access_pass => access_pass,
610
+ :mail_address => 'test@example.com',
611
+ :client_field_1 => client_field_1,
612
+ :client_field_flg => 1
613
+ })
614
+ result["OrderID"].nil?.should_not be_truthy
615
+ result["ReceiptNo"].nil?.should_not be_truthy
616
+ result["EdyOrderNo"].nil?.should_not be_truthy
617
+ result["PaymentTerm"].nil?.should_not be_truthy
618
+ result["TranDate"].nil?.should_not be_truthy
619
+ result["CheckString"].nil?.should_not be_truthy
620
+ (result["ClientField1"] == client_field_1).should be_truthy
621
+ result["ClientField3"].nil?.should_not be_truthy
622
+ end
623
+
624
+ it "got error if missing options", :vcr do
625
+ lambda {
626
+ result = @service.exec_tran_edy()
627
+ }.should raise_error("Required access_id, access_pass, order_id, mail_address were not provided.")
628
+ end
629
+ end
630
+
473
631
  describe "#exec_tran_brandtoken" do
474
632
  it "gets data about a transaction", :vcr do
475
633
  order_id = generate_id
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gmo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.3
4
+ version: 0.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tatsuo Kaniwa
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-07 00:00:00.000000000 Z
11
+ date: 2022-09-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -133,22 +133,28 @@ files:
133
133
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_entry_tran_cvs_gets_data_about_a_transaction.yml
134
134
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_entry_tran_cvs_got_error_if_missing_options.yml
135
135
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_entry_tran_docomo_gets_data_about_a_transaction.yml
136
+ - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_entry_tran_edy_gets_data_about_a_transaction.yml
136
137
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_entry_tran_gets_data_about_a_transaction.yml
137
138
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_entry_tran_got_error_if_missing_options.yml
138
139
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_entry_tran_linepay_gets_data_about_a_transaction.yml
139
140
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_entry_tran_pay_easy_gets_data_about_a_transaction.yml
140
141
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_entry_tran_rakuten_id_gets_data_about_a_transaction.yml
142
+ - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_entry_tran_suica_gets_data_about_a_transaction.yml
143
+ - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_entry_tran_virtualaccount_gets_data_about_a_transaction.yml
141
144
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_exec_tran_brandtoken_gets_data_about_a_transaction.yml
142
145
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_exec_tran_brandtoken_parameter_contains_Japanese_characters_should_correctly_handle_Japanese.yml
143
146
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_exec_tran_cvs_gets_data_about_a_transaction.yml
144
147
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_exec_tran_docomo_gets_data_about_a_transaction.yml
145
148
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_exec_tran_doesn_t_require_card_info_if_token_is_present.yml
149
+ - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_exec_tran_edy_gets_data_about_a_transaction.yml
146
150
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_exec_tran_gets_data_about_a_transaction.yml
147
151
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_exec_tran_got_error_if_missing_options.yml
148
152
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_exec_tran_linepay_gets_data_about_a_transaction.yml
149
153
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_exec_tran_parameter_contains_Japanese_characters_should_correctly_handle_Japanese.yml
150
154
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_exec_tran_pay_easy_gets_data_about_a_transaction.yml
151
155
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_exec_tran_rakuten_id_gets_data_about_a_transaction.yml
156
+ - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_exec_tran_suica_gets_data_about_a_transaction.yml
157
+ - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_exec_tran_virtualaccount_gets_data_about_a_transaction.yml
152
158
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_refund_tran_brandtoken_gets_data_about_a_transaction.yml
153
159
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_sales_tran_brandtoken_gets_data_about_a_transaction.yml
154
160
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_search_trade_gets_data_about_order.yml
@@ -159,9 +165,11 @@ files:
159
165
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/_void_tran_brandtoken_gets_data_about_order.yml
160
166
  - fixtures/vcr_cassettes/GMO_Payment_ShopAPI/secure_tran_request_params.yml
161
167
  - fixtures/vcr_cassettes/GMO_Payment_ShopAndSiteAPI/_exec_tran_brandtoken_got_data.yml
168
+ - fixtures/vcr_cassettes/GMO_Payment_ShopAndSiteAPI/_register_recurring_credit_got_data.yml
162
169
  - fixtures/vcr_cassettes/GMO_Payment_ShopAndSiteAPI/_trade_brandtoken_got_data.yml
163
170
  - fixtures/vcr_cassettes/GMO_Payment_ShopAndSiteAPI/_trade_card_got_data.yml
164
171
  - fixtures/vcr_cassettes/GMO_Payment_ShopAndSiteAPI/_trade_card_got_error_if_missing_options.yml
172
+ - fixtures/vcr_cassettes/GMO_Payment_ShopAndSiteAPI/_unregister_recurring_success_unregister.yml
165
173
  - fixtures/vcr_cassettes/GMO_Payment_SiteAPI/_delete_brandtoken_gets_data_about_a_brandtoken.yml
166
174
  - fixtures/vcr_cassettes/GMO_Payment_SiteAPI/_delete_card_gets_data_about_a_card.yml
167
175
  - fixtures/vcr_cassettes/GMO_Payment_SiteAPI/_delete_member_gets_data_about_a_member.yml
@@ -203,7 +211,7 @@ homepage: https://github.com/t-k/gmo-payment-ruby
203
211
  licenses:
204
212
  - MIT
205
213
  metadata: {}
206
- post_install_message:
214
+ post_install_message:
207
215
  rdoc_options:
208
216
  - "--line-numbers"
209
217
  - "--inline-source"
@@ -222,9 +230,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
222
230
  - !ruby/object:Gem::Version
223
231
  version: '0'
224
232
  requirements: []
225
- rubyforge_project:
226
- rubygems_version: 2.7.8
227
- signing_key:
233
+ rubygems_version: 3.0.3.1
234
+ signing_key:
228
235
  specification_version: 4
229
236
  summary: 'GMO Payment API client: Ruby client library for the GMO Payment Platform.'
230
237
  test_files: []