implement payment

This commit is contained in:
Joerg Lehmann 2019-09-23 18:21:42 +02:00
parent b6156be6af
commit a1fe007728
5 changed files with 138 additions and 82 deletions

13
main.go
View File

@ -8,19 +8,6 @@ import (
"time" "time"
) )
type Scale struct {
Deveui string
Alias string
Alarmactive string
Smsnumber string
Last_measurement string
Last_temp string
Last_humidity string
Last_weight string
Last_pressure string
Last_accu_level string
}
func serveTemplate(w http.ResponseWriter, r *http.Request) { func serveTemplate(w http.ResponseWriter, r *http.Request) {
logit("Called URL: "+r.URL.Path) logit("Called URL: "+r.URL.Path)
// wennn kein File angegeben ist: index.html // wennn kein File angegeben ist: index.html

View File

@ -12,16 +12,18 @@ import (
) )
type OneMetric struct { type OneMetric struct {
Deveui string Deveui string
Alias string Alias string
Alarmactive string Alarmactive string
Smsnumber string Smsnumber string
Timestamp string Timestamp string
Temperature string Temperature string
Humidity string Humidity string
Weight string Weight string
Pressure string Pressure string
BatteryPercent string BatteryPercent string
ActiveUntil string
DaysUntilDeactivated int // berechneter Wert
} }
@ -252,6 +254,19 @@ func lastmetricsHandler(response http.ResponseWriter, request *http.Request) {
} }
} }
func CalcDaysUntil(mydate string) int {
var days int
layout := "01.01.2006"
t, err := time.Parse(layout, mydate)
if err != nil {
days = 0
}
days = int(t.Sub(time.Now()).Hours() / 24)
return days
}
func getLastMetrics(deveui string) OneMetric { func getLastMetrics(deveui string) OneMetric {
var res OneMetric var res OneMetric
@ -320,5 +335,7 @@ func getLastMetrics(deveui string) OneMetric {
res.Alias = getDevAlias(deveui) res.Alias = getDevAlias(deveui)
res.Alarmactive = getDevAlarmactive(deveui) res.Alarmactive = getDevAlarmactive(deveui)
res.Smsnumber = getDevSmsnumber(deveui) res.Smsnumber = getDevSmsnumber(deveui)
res.ActiveUntil = getActiveUntil(deveui)
res.DaysUntilDeactivated = CalcDaysUntil(res.ActiveUntil)
return res return res
} }

View File

@ -51,11 +51,11 @@ func ping(c redis.Conn) error {
} }
type Dev struct { type Dev struct {
Deveui string Deveui string
Alias string Alias string
Alarmactive string Alarmactive string
Smsnumber string Smsnumber string
ActiveUntil string // Abo bezahlt bis TT.MM.YYYY ActiveUntil string // Abo bezahlt bis TT.MM.YYYY
} }
func initDB() { func initDB() {
@ -205,6 +205,29 @@ func getDevSmsnumber(deveui string) string {
return res return res
} }
func getActiveUntil(deveui string) string {
res := ""
if deveui == "" {
return res
}
conn := globalPool.Get()
defer conn.Close()
logit("getActiveUntil: Deveui: "+deveui)
activeuntil, err := redis.String(conn.Do("HGET", devPrefix+deveui, "active_until"))
if err == nil {
logit("getActiveUntil: activeuntil: "+activeuntil)
res = activeuntil
} else {
log.Print(err)
}
return res
}
func prolongActivation(deveui string, years int) (string, error) { func prolongActivation(deveui string, years int) (string, error) {
conn := globalPool.Get() conn := globalPool.Get()
defer conn.Close() defer conn.Close()
@ -226,9 +249,9 @@ func prolongActivation(deveui string, years int) (string, error) {
var t_new time.Time var t_new time.Time
if t.Before(time.Now()) { if t.Before(time.Now()) {
t_new = time.Now().AddDate(1, 0, 0) t_new = time.Now().AddDate(years, 0, 0)
} else { } else {
t_new = t.AddDate(1, 0, 0) t_new = t.AddDate(years, 0, 0)
} }
active_until_new := t_new.Format(layout) active_until_new := t_new.Format(layout)

View File

@ -53,9 +53,10 @@ Device ID: <span id="deveui"></span>
<div class="modal-background"></div> <div class="modal-background"></div>
<div class="modal-card"> <div class="modal-card">
<header class="modal-card-head"> <header class="modal-card-head">
<p class="modal-card-title">Abos</p> <p class="modal-card-title">Abo verl&auml;ngern</p>
</header> </header>
<section class="modal-card-body"> <p id="charge_data" hidden>0</p>
<section class="modal-card-body" id="abos_verlaengern">
<!-- Content ... --> <!-- Content ... -->
</section> </section>
<footer class="modal-card-foot"> <footer class="modal-card-foot">
@ -66,8 +67,8 @@ Device ID: <span id="deveui"></span>
</div> </div>
{{range .LastMetrics}} {{range .LastMetrics}}
<div class="column is-full notification is-warning"> <div class="column waage is-full notification is-warning">
<p class="is-size-2 is-size-5-mobile has-text-centered has-text-weight-bold" ><span id="alias_{{.Deveui}}">{{.Alias}}</span><a class="show-modal" class="block-link"><span style="float:right;" class="icon is-size-4 is-size-5-mobile"><i class="fa fa-cog"></i></span></a></p> <p class="is-size-2 is-size-5-mobile has-text-centered has-text-weight-bold" ><span class="alias" id="alias_{{.Deveui}}">{{.Alias}}</span><a class="show-modal" class="block-link"><span style="float:right;" class="icon is-size-4 is-size-5-mobile"><i class="fa fa-cog"></i></span></a></p>
<p id="alarmactive_{{.Deveui}}" hidden>{{.Alarmactive}}</p> <p id="alarmactive_{{.Deveui}}" hidden>{{.Alarmactive}}</p>
<p id="smsnumber_{{.Deveui}}" hidden>{{.Smsnumber}}</p> <p id="smsnumber_{{.Deveui}}" hidden>{{.Smsnumber}}</p>
<p id="lastmeasurement_{{.Deveui}}" class="has-text-centered">letzte &uuml;bermittelte Messung: {{.Timestamp}}</p> <p id="lastmeasurement_{{.Deveui}}" class="has-text-centered">letzte &uuml;bermittelte Messung: {{.Timestamp}}</p>
@ -117,9 +118,10 @@ Device ID: <span id="deveui"></span>
</nav> </nav>
</div> </div>
<div class="has-text-centered"> <div class="has-text-centered">
<span class="is-size-6 has-text-centered" id="paid_until_{{.Deveui}}">aktiv bis</span> <span class="is-size-6 has-text-centered">aktiv bis</span>
<span class="is-size-6 has-text-centered" id="paid_until_{{.Deveui}}">01.01.1234</span> <span class="paid_until is-size-6 has-text-centered">{{.ActiveUntil}}</span>
</div> </div>
{{ if (lt .DaysUntilDeactivated 1095) }}
<div class="has-text-centered is-size-7"> <div class="has-text-centered is-size-7">
<p class="abo_add_years_text" id="abo_add_years_text_{.Deveui}}">&nbsp;</p> <p class="abo_add_years_text" id="abo_add_years_text_{.Deveui}}">&nbsp;</p>
</div> </div>
@ -141,11 +143,14 @@ Device ID: <span id="deveui"></span>
</span> </span>
</a> </a>
</div> </div>
{{ end }}
</div> </div>
</div> </div>
{{end}} {{end}}
<script type="text/javascript" src="https://cdn.jsdelivr.net/momentjs/latest/moment.min.js"></script>
<script> <script>
function validate(what, text) { function validate(what, text) {
@ -218,11 +223,40 @@ $(".abo_minus").click(function() {
} }
}); });
function add_years(dt,n)
{
return new Date(dt.setFullYear(dt.getFullYear() + n));
}
$(".abo_pay").click(function() { $(".abo_pay").click(function() {
console.log("pay..."); console.log("pay...");
el = $(this).parent().find(".abo_add_years"); counter = 0;
counter = Number(el.html()); charge_data = '';
abo_table = '<table class="table is-bordered is-fullwidth" >';
abo_table += '<tr><th class="is-2">Alias</th><th>verl&auml;ngern bis</th><th class="has-text-right">Betrag</th></tr>';
$(".waage").each(function( index ) {
console.log( index + ": " + $( this ).find(".alias").html() );
this_count = Number($( this ).find(".abo_add_years").html());
if (this_count > 0) {
counter += this_count;
this_date = $( this ).find(".paid_until").html();
abo_table += '<tr><td>' + $( this ).find('.alias').html() + '</td><td>' + moment(this_date,'DD.MM.YYYY').add('years', this_count).format('DD.MM.YYYY') + '</td><td class="has-text-right">' + (this_count * 24).toFixed(2) + '</td></tr>';
if (charge_data == '') {
charge_data = $( this ).find("div").first().attr('id') + ":" + this_count;
} else {
charge_data += "," + $( this ).find("div").first().attr('id') + ":" + this_count;
}
}
console.log( counter );
});
abo_table += '<tr><td>Total CHF</td><td></td><td class="has-text-right">' + (counter * 24).toFixed(2) + '</td></tr>';
console.log("Counter: "+counter);
abo_table += "</table>";
if (counter > 0) { if (counter > 0) {
console.log(abo_table);
console.log("charge_data: "+charge_data);
$("#abos_verlaengern").html(abo_table);
$("#charge_data").html(charge_data);
$("#cart").addClass("is-active"); $("#cart").addClass("is-active");
} }
}); });
@ -317,10 +351,7 @@ $("#cart-pay").click(function() {
type: "get", //send it through get method type: "get", //send it through get method
dataType: "json", dataType: "json",
data: { data: {
charge_name: "Abo", charge_data: $("#charge_data").html()
charge_description: "Desription",
charge_amount_rappen: 500,
charge_quantity: 1
}, },
success: function(response) { success: function(response) {
console.log('pay success'); console.log('pay success');

View File

@ -3,11 +3,12 @@ package main
import ( import (
"fmt" "fmt"
"log" "log"
"strconv"
"os" "os"
"io/ioutil" "io/ioutil"
"encoding/json" "encoding/json"
"net/http" "net/http"
"strings"
"strconv"
"github.com/stripe/stripe-go" "github.com/stripe/stripe-go"
"github.com/stripe/stripe-go/checkout/session" "github.com/stripe/stripe-go/checkout/session"
"github.com/stripe/stripe-go/webhook" "github.com/stripe/stripe-go/webhook"
@ -21,45 +22,27 @@ func getstripesessionHandler(response http.ResponseWriter, request *http.Request
name := getUserName(request) name := getUserName(request)
if name != "" { if name != "" {
charge_name, ok := request.URL.Query()["charge_name"] charge_data, ok := request.URL.Query()["charge_data"]
if !ok || len(charge_name[0]) < 1 { if !ok || len(charge_data[0]) < 1 {
log.Println("Url Param 'charge_name' is missing") log.Println("Url Param 'charge_data' is missing")
fmt.Fprintf(response, "{ \"rc\": 1, \"msg\": \"charge_name must be specified in URL\" }") fmt.Fprintf(response, "{ \"rc\": 1, \"msg\": \"charge_data must be specified in URL\" }")
return return
} }
charge_description, ok := request.URL.Query()["charge_description"] scales := strings.Split(charge_data[0],",")
if !ok || len(charge_description[0]) < 1 {
log.Println("Url Param 'charge_description' is missing")
fmt.Fprintf(response, "{ \"rc\": 2, \"msg\": \"charge_description must be specified in URL\" }")
return
}
charge_quantity, ok := request.URL.Query()["charge_quantity"] var abo_years = 0
if !ok || len(charge_quantity[0]) < 1 { var items []string
log.Println("Url Param 'charge_quantity' is missing") for _,scale := range scales {
fmt.Fprintf(response, "{ \"rc\": 3, \"msg\": \"charge_quantity must be specified in URL\" }") items = strings.Split(scale,":")
return if (len(items) == 2) {
} abo_count, err := strconv.Atoi(items[1])
charge_quantity_int64, err := strconv.Atoi(charge_quantity[0]) if err == nil {
if err == nil { abo_years += abo_count
fmt.Println(charge_quantity_int64) }
} else { }
fmt.Println(charge_quantity[0], "is not an integer.") }
} abo_amount := int64(abo_years * 2400)
charge_amount_rappen, ok := request.URL.Query()["charge_amount_rappen"]
if !ok || len(charge_amount_rappen[0]) < 1 {
log.Println("Url Param 'charge_amount_rappen' is missing")
fmt.Fprintf(response, "{ \"rc\": 4, \"msg\": \"charge_amount_rappen must be specified in URL\" }")
return
}
charge_amount_rappen_int64, err := strconv.Atoi(charge_amount_rappen[0])
if err == nil {
fmt.Println(charge_amount_rappen_int64,)
} else {
fmt.Println(charge_amount_rappen[0], "is not an integer.")
}
stripe.Key = getStripeKey() stripe.Key = getStripeKey()
@ -67,13 +50,16 @@ func getstripesessionHandler(response http.ResponseWriter, request *http.Request
PaymentMethodTypes: stripe.StringSlice([]string{ PaymentMethodTypes: stripe.StringSlice([]string{
"card", "card",
}), }),
ClientReferenceID: stripe.String(charge_data[0]),
CustomerEmail: stripe.String(name),
Locale: stripe.String("de"),
LineItems: []*stripe.CheckoutSessionLineItemParams{ LineItems: []*stripe.CheckoutSessionLineItemParams{
&stripe.CheckoutSessionLineItemParams{ &stripe.CheckoutSessionLineItemParams{
Name: stripe.String(charge_name[0]), Name: stripe.String("Jahresabos mini-beieli.ch"),
Description: stripe.String(charge_description[0]), Description: stripe.String("Blablabla Description"),
Amount: stripe.Int64(int64(charge_amount_rappen_int64)), Amount: stripe.Int64(abo_amount),
Currency: stripe.String(string(stripe.CurrencyCHF)), Currency: stripe.String(string(stripe.CurrencyCHF)),
Quantity: stripe.Int64(int64(charge_quantity_int64)), Quantity: stripe.Int64(1),
}, },
}, },
SuccessURL: stripe.String("https://mini-beieli.ch/payment_received.html"), SuccessURL: stripe.String("https://mini-beieli.ch/payment_received.html"),
@ -123,7 +109,19 @@ func stripeWebhookHandler(response http.ResponseWriter, request *http.Request) {
// Fulfill the purchase... // Fulfill the purchase...
//handleCheckoutSession(session) //handleCheckoutSession(session)
scales := strings.Split(session.ClientReferenceID,",")
var items []string
for _,scale := range scales {
items = strings.Split(scale,":")
if (len(items) == 2) {
abo_count, err := strconv.Atoi(items[1])
if err == nil {
_,_ = prolongActivation(items[0],abo_count)
}
}
}
log.Println("handleCheckoutSession "+session.ID) log.Println("handleCheckoutSession "+session.ID)
log.Println("handleCheckoutSession "+session.ClientReferenceID)
} }
response.WriteHeader(http.StatusOK) response.WriteHeader(http.StatusOK)