前言
公司的APP由于要在瑞典投入使用,所以需要接入当地的Swish支付,但这种支付方式,在他们的官网只有简单的几个文档,Github上也没有提供Demo, 网上的资料几乎没有,所以这里写一篇对接入这个支付的流程总结,希望对需要使用Swish支付的同学有帮助。
这里是Swish的开发者文档官方地址:https://developer.getswish.se/merchants/
为什么要接入Swish支付?
Swish是超过半数瑞典人都在使用的移动支付APP,瑞典总人口约970万人,Swish的使用人数已经超过500万,支持瑞典的六家银行。所以Swish在瑞典的地位,就和微信支付,支付宝支付在中国国内的地位一样。
1. 配置Swish的后台证书环境
这个步骤是由后台的同学来做的,需要进入这个网页配置Swish的证书,https://comcert.getswish.net/cert-mgmt-web/authentication
在配置过程中需要的CSR文件是在服务器上生成的,然后复制文件的内容到输入框里,如下图所示
然后会生成一个PEM证书文件,如下图所示,把里面的内容拷贝下来,自己新建一个PEM证书文件格式的内容保存下来
2. APP获取token
APP传递付款金额,货币(Swish暂时只支持SEK,所以除了瑞典克朗其他货币都是不支持的),付款描述这些值给后台接口,然后后台会返回token(用来跳转到Swish APP进行支付) paymentID(后面会用来做支付状态验证)。
下面是我的请求这个接口的代码示例,仅供参考
//发送付款请求(swish)
-(RACSignal *)getSwishPaymentTokenSignal:(NSString *) amount currency:(NSString *)currency desc:(NSString *)desc{
@weakify(self)
return [[[self.services.client getSwishPaymentToken:amount
currency:currency
desc:desc] doNext:^(id _Nullable response) {
@strongify(self)
self.clientToken = response[@"token"];
self.paymentId = response[@"id"];
}] takeUntil:self.rac_willDeallocSignal];
}
3. 后台生成token返回给APP
后台调用这个请求支付接口(这里是正式环境的接口,由于Swish测试环境不能进行使用Swish APP支付的测试,所以我这里直接使用的正式环境)
https://cpc.getswish.net/swish-cpcapi/api/v1/paymentrequests
这里是后台请求的示例代码,这里的证书文件是p12格式的,是由上面步骤的PEM证书直接生成的:
curl -v --data '{ "payeePaymentReference": "0123456789", "callbackUrl":
"https://example.com/api/swishcb/paymentrequests", "payeeAlias":
"1231181189", "amount": "100", "currency": "SEK", "message": "Kingston
USB Flash Drive 8 GB" }' -H "Content-Type: application/json" POST
https://mss.cpc.getswish.net/swish-cpcapi/api/v1/paymentrequests --cert
"Swish Merchant Test Certificate 1231181189.p12:swish" --cert-type p12 --
cacert "Swish TLS Root CA.pem"
这个接口会返回Token和paymentID,是返回在请求头里的,如下所示
< HTTP/1.1 201
< Location: https://mss.cpc.getswish.net/swishcpcapi/api/v1/paymentrequests/11A86BE70EA346E4B1C39C874173F088
< Server: nginx/1.12.1
< Connection: keep-alive
< PaymentRequestToken: ed16db6f415145ec93642e294c904378
< Content-Length: 0
< Date: Fri, 04 Jan 2019 08:34:59 GMT
<
4. APP调用Swish APP进行支付
在调起Swish APP进行支付前,首先要配置当前应用的Scheme
如下图所示,在工程info下的URL Types配置URL Schemes,我这里写的是自己的应用名拼接swish.com,这里可以自定义,配置好即可
使用token跳转到Swish APP进行支付,代码如下所示:
下面的xxx1是上图配置的URL Schemes,xxx2是上图中的Identifier,一定要配置对,不然会跳转不回自己的APP。
- (void)swishPay:(NSString *)token{
if (@available(iOS 10.0, *)) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"swish://paymentrequest?token=%@&callbackurl=xxx1://xxx2.swish.com",token]] options:@{} completionHandler:^(BOOL success) {
}];
} else {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"swish://paymentrequest?token=%@&callbackurl=xxx1://xxx2.swish.com",token]]];
}
}
5. 验证Swish支付是否成功
在Swish APP里支付完成后,会返回到自己的应用里,在AppDelegate.m 写上以下代码监听Swish跳转回当前应用。由于Swish支付未提供支付回调接口,所以手动发通知给支付页面,请求后台去判断是否支付成功。
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
if([url.absoluteString containsString:@"swish"]){
//swish支付跳转回来
[MHNotificationCenter postNotificationName:SDSwishPayResultNotification object:nil];
}
return YES;
}
监听到需要发送的通知后,传递paymentId(在上面后台已经返回过来了)给后台,调用后台的Swish验证接口,验证是否支付成功。
6. 后台验证Swish支付
后台查询付款的接口是: /api/v1/paymentrequests/{id}
请求示例代码如下所示:
curl -v "Content-Type: application/json" GET
https://mss.cpc.getswish.net/swishcpcapi/api/v1/paymentrequests/5D59DA1B1632424E874DDB219AD54597 --cert
"Swish Merchant Test Certificate 1231181189.p12:swish" --cert-type p12 --
cacert "Swish TLS Root CA.pem"
返回示例代码如下所示:
< HTTP/1.1 200
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Fri, 04 Jan 2019 09:00:29 GMT
<
* Connection #1 to host mss.cpc.getswish.net left intact
{"id":"5D59DA1B1632424E874DDB219AD54597","payeePaymentReference":"0123456
789","paymentReference":"1E2FC19E5E5E4E18916609B7F8911C12","callbackUrl":
"https://example.com/api/swishcb/paymentrequests","payerAlias":"467123476
8","payeeAlias":"1231181189","amount":100.00,"currency":"SEK","message":"
Kingston USB Flash Drive 8 GB","status":"PAID","dateCreated":"2019-01-
02T14:29:51.092Z","datePaid":"2019-01-
02T14:29:55.093Z","errorCode":null,"errorMessage":""}
如果能查到该付款的status 为 PAID,即表示Swish支付是成功的,在接口里返回成功给APP即可。
总结
以上就是接入Swish支付的整个流程分析,如果还需要退款功能,可以参照API文档,和支付的接口内容是差不多的,这是Swsih支付的官方文档地址:
https://developer.getswish.se/content/uploads/2019/03/Merchant-Integration-Guide.pdf
期待
-
文章若有些许帮助,请给个喜欢或评论;若没啥帮助,请给点建议~
-
如果有疑问,请在文章底部评论指出,我会火速解决和修正问题。
网友评论