Phonegap 之 iOS银联在线支付(js调用ios端银联支付控件)

2023-10-31

  Phonegap项目,做支付的时候,当把网站打包到ios或android端成app后,在app上通过wap调用银联在线存在一个问题:

就是当从银联支付成功后,再从服务器返回到app客户端就很难实现。

  wap银联支付流程是这样:客户端---> 服务器(构建支付请求)--> 银联支付 ---> 返回到服务端(处理支付结果)。所以对于手机网站银联支付没有问题,但是对于ios端app和android端app, 再通过wap支付,发现支付成功后,很难在回到app客户端了。

所以这里就必须借助Phonegap的插件js脚本,通过js调用ios端或android端原生代码,然后再通过原生代码调用银联支付专门为移动客户端准备的sdk,去进行支付。支付成功后,银联会把支付结果一边通知到我们网站你的服务器,另一方面也会把给一个通知到ios或android客户端,这样就完美了!

  ------------------------------------------------------------------------------------------------------------------------------

  先上Phonegap项目ios端app如何调用银联在线的支付流程截图:

 1、客户端请求银联支付,网站服务端构建银联支付请求;并从银联获得银联生成的系统流水号

  

2、通过Phonegap脚本插件,调用OC代码,OC调用银联支付接口,弹出银联支付控件,输入你的银联卡号和手机验证码等信息,完成支付

        

  

3、支付成功后,点击“返回商户”, 银联一边会回传一个信息到网站服务端,一边也会通知ios端app的代理控制器支付结果。

  然后ios端这边可以根据银联返回的支付信息,做自己的业务逻辑处理。

  

 

------------------------------------  大概代码如下:  -------------------------------

1、客户端选择银联支付,js端代码:

//模拟去服务器端构建银联请求, myApp是使用Framework7框架创建的一个js对象
function toPay() {
    var ServerDomain = "http://192.168.1.189"; //网站服务端地址
    var isApp = ServerDomain.indexOf(location.hostname) > 0 ? "0" : "1";  //是否来自app的请求

    $$.ajax({
        url: ServerDomain + "Payment/CreateOrderInfo",
        method: "post",
        dataType: "json",
        data: { "isApp": isApp },
        success: function (data) {
            if (data.success == "0") {
                myApp.alert(data.info); //弹窗提示信息
                return false;
            }

            //data.info 信息,如果是通过手机网站访问,则data.info是一个form表单html页面代码;
            //如果是移动客户端(ios或android),则data.info是来自银联的系统流水号:tn
            if (isApp == "0") { //来自wap的请求
                //针对手机网站的银联支付请求,直接构建get请求表单,跳转到银联那边
                document.write(data.info); 
            }
            else if (myApp.device.ios) { //来自ios app的请求
                Cordova.exec(function (successInfo) { /*成功通知方法*/ }, function (errorInfo) { /*失败回调通知方法*/ }, "PluginName", "uppay", [data.info]);
            }
            else if (myApp.device.android) { //来自android app的请求
                UnionPayFunc(data.info);
            }
        }
    });
}
View Code

 

2、服务端构建银联支付请求代码,服务端使用C#的MVC

public class PaymentController : Controller
    {
        /// <summary>测试构建银联支付请求:如果是wap请求,则构建form表单;若是app请求,则获取银联系统流水号
        /// </summary>
        /// <param name="isApp">是否来自app的请求【0表示来自wap, 1表示来自android】</param>
        /// <returns></returns>
        public JsonResult CreateOrderInfo(int isApp)
        {
            //以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考
            // **************演示前台交易的请求***********************
            Dictionary<string, string> param = new Dictionary<string, string>();
            //生成订单编号
            Random rnd = new Random();
            string orderID = DateTime.Now.ToString("yyyyMMddHHmmss") + (rnd.Next(900) + 100).ToString().Trim(); 

            param["version"] = "5.0.0";//版本号
            param["encoding"] = "UTF-8";//编码方式
            param["certId"] = CertUtil.GetSignCertId(); //证书ID(签名私钥证书的Serial Number)
            param["txnType"] = "01";//交易类型:00=查询交易,01=消费,04=退货,12=代付,21=批量交易,22=批量查询
            param["txnSubType"] = "01";//交易子类,依据实际交易类型填写
            param["bizType"] = "000201";//产品类型:000201=B2C网关支付,000401=代付,000501=代收,000601=账单支付,000901=绑定支付,000202=B2B

            param["frontUrl"] = "http://192.168.1.189/Payment/UppayFront"; //前台通知地址(前台返回商户结果时使用,前台类交易需上送)     
            param["backUrl"] = "http://192.168.1.189/Payment/UnppayBack";  //后台通知地址,改自己的外网地址(后台返回商户结果时使用,如上送,则发送商户后台交易结果通知)
            //param["frontFailUrl"] = "http://192.168.1.189/Payment/UnppayFail";//失败交易前台跳转地址(可选:支付失败时,页面跳转至商户该URL,不带交易信息,仅跳转)
            param["signMethod"] = "01";//签名方法(01:表示采用RSA)
            param["channelType"] = "08";//渠道类型: 05=语音,07=互联网(PC),08=移动(手机)
            param["accessType"] = "0";//接入类型:0=商户直连接入,1=收单机构接入,2=平台商户接入
            param["merId"] = "111111111111111";//商户代码(请填入已被批准加入银联互联网系统的商户代码)
            param["orderId"] = orderID;//商户订单号(不能含”-“或”_")
            param["txnTime"] = DateTime.Now.ToString("yyyyMMddHHmmss");//订单发送时间
            param["txnAmt"] = "1";//交易金额,单位分
            param["currencyCode"] = "156";//交易币种(币种格式必须为3位代码,默认取值:156(人民币))
            //param["orderDesc"] = "订单描述";//订单描述,暂时不会起作用
            param["reqReserved"] = "";//请求方保留域,透传字段,查询、通知、对账文件中均会原样出现

            //将参数进行签名
            SDKUtil.Sign(param, Encoding.UTF8);

            string returnInfo = ""; //返回信息
            string isSuccess = "1"; //

            if (isApp == 0)//wap请求,则返回form表单请求请求
            {
                // 将SDKUtil产生的Html文档写入页面,从而引导用户浏览器重定向   
                returnInfo = SDKUtil.CreateAutoSubmitForm(SDKConfig.FrontTransUrl, param, Encoding.UTF8) + "<script type='text/javascript'>OnLoadSubmit();</script>";
            }
            else if (isApp == 1)//app请求,则返回银联生成的系统流水号
            {
                // 初始化通信处理类
                HttpClient hc = new HttpClient(SDKConfig.AppRequestUrl);
                //// 发送请求获取通信应答
                int status = hc.Send(param, Encoding.UTF8);
                // 返回结果
                string result = hc.Result;

                if (status != 200)
                {
                    isSuccess = "0";
                    returnInfo = "请求银联失败";
                    return Json(new { success = isSuccess, info = returnInfo }, JsonRequestBehavior.AllowGet);
                }

                Dictionary<string, string> resData = SDKUtil.CoverstringToDictionary(result);

                if (!SDKUtil.Validate(resData, Encoding.UTF8))
                {
                    returnInfo = "验证失败";
                    isSuccess = "0";
                    return Json(new { success = isSuccess, info = returnInfo }, JsonRequestBehavior.AllowGet);
                }

                string respCode = resData["respCode"];
                string respMsg = resData["respMsg"];
                returnInfo = resData["tn"]; //银受理订单号:商户推送订单后银联移动支付系统返回该流水号,商户调用支付控件时使用
            }
        
            return Json(new { success = isSuccess, info = returnInfo }, JsonRequestBehavior.AllowGet);
        }

        ///........
}
View Code

 

3、ios端代码,js脚本调用OC代码需要Phonegap提供的一个脚本插件支持: cordova.js (下载链接)

  创建一个类Plugin, 继承Phonegap插件类:CDVPlugin, 

  还需要在配置文件config.xml中配置一下,才能使用js调用Plugin类里面的方法

  

#import <UIKit/UIKit.h>
#import <Cordova/CDVPlugin.h>

@interface Plugin : CDVPlugin

@property (nonatomic, copy) NSString* callbackID;

//支付
- (void)uppay:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;

@end
View Code
#import "Plugin.h"
#import "MainViewController.h"
#import "UPPayPlugin.h"

@interface Plugin ()

@end

@implementation Plugin

@synthesize callbackID;

- (void)uppay:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options{
    // 这是classid,在下面的PluginResult进行数据的返回时,将会用到它
    self.callbackID = [arguments pop];

    NSString *tn = [arguments objectAtIndex:0]; //获取银联生成返回的系统流水号
    MainViewController *controller = (MainViewController *)self.viewController;
    
    //调用银联支付接口
    [UPPayPlugin startPay:tn mode:@"00" viewController:controller delegate:controller];
}

@end
View Code

  代理控制器设置银联支付结束后的代理方法:

#import <Cordova/CDVViewController.h>
#import <Cordova/CDVCommandDelegateImpl.h>
#import <Cordova/CDVCommandQueue.h>
#import "UPPayPluginDelegate.h"

@interface MainViewController : CDVViewController <UPPayPluginDelegate>

//..........

@end
View Code
#import "MainViewController.h"
#import "AppDelegate.h"

@implementation MainViewController

#pragma mark - 支付结束后代理方法
//success、fail、cancel,分别代表:支付成功、支付失败、用户取消支付
-(void)UPPayPluginResult:(NSString*)result
{
    NSLog(@"支付结果:%@", result);
    
    //调用脚本方法,处理支付完成后的逻辑
    [self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"unipayPayResult('%@');", result]];
}

//.......

@end
View Code

 

4、支付成功后,ios 控制器收到银联的支付结果,调用js脚本方法,处理后面逻辑: 

// ios支付成功后,收到银联通知跳转到其他页面去, info参数有三种状态:success, fail, cancl
function unipayPayResult(info) {
    var textTip = "";
    if (info == "success") {
        textTip = "支付成功";
    }
    else if (info == "fail") {
        textTip = "支付失败";
    }
    else {
        textTip = "取消支付";
    }

    myApp.alert(textTip);
    //弹窗提示后,跳到主页面去
    mainView.loadPage("index.html");
}
View Code

 

原文链接地址:http://www.cnblogs.com/tandaxia/p/4964753.html

 

cordova for iOS 通过js调用OC原生代码demo:

github地址:https://github.com/xiaotanit/Tan_CordovaPlugin

csdn地址: http://download.csdn.net/detail/tandaxia/9524576

 

转载于:https://www.cnblogs.com/tandaxia/p/4964753.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Phonegap 之 iOS银联在线支付(js调用ios端银联支付控件) 的相关文章

随机推荐

  • pytorch 初始化

    初始化权值
  • 蓝桥杯:试题F:青蛙过河问题

    试题描述 小青蛙住在一条河边 它想到河对岸的学校去学习 小青蛙打算经过河里 的石头跳到对岸 河里的石头排成了一条直线 小青蛙每次跳跃必须落在一块石头或者岸上 不过 每块石头有一个高度 每次小青蛙从一块石头起跳 这块石头的高度就 会下降 1
  • vue项目 设置scrollTop不起作用 总结

    今天在开发中 遇到这样一个情景 一个页面中有三个模块 每个模块对应一个标题 每个模块内容都很长 所以需要点击当前模块对应的标题滚动到模块所在位置 我想的方案是获取到每个模块距离文档顶部的距离 然后将值赋给对应要滚动的元素 步骤如下 首先给每
  • 【每日运维】RockyLinux8.6升级OpenSSH9.4p1

    为什么需要升级openssh呢 因为很多项目进行漏扫结果都会涉及到这个服务器核心组件 一想到以前升级openssh带来的各种依赖性问题就头疼 不管是什么发行版 升级这个东西真的很烦 这次发现可能还会有好一点的通用一点的升级方法 所以有个这个
  • angular调用接口方式_如何在Angular优雅编写HTTP请求

    引言 基本上当下的应用都会分为前端与后端 当然这种前端定义不在限于桌面浏览器 手机 APP等设备 一个良好的后端会通过一套所有前端都通用的 RESTful API 序列接口作为前后端之间的通信 这其中对于身份认证都不可能再依赖传统的Sess
  • 微信小程序面试题

    1 请谈谈wxml与标准的html的异同 标签名字有点不一样 多了一些 wx if 这样的属性以及 这样的表达式 开发工具限制 WXML仅能在微信小程序开发工具中预览 而HTML可以在浏览器内预览 组件封装不同 WXML对组件进行了重新封装
  • 今年做什么副业好?2021年做什么副业挣钱?2021年适合做的副业

    这两年我明白了一个道理 就是人无远虑必有近忧 所以2021我建议大家最好有一个副业 因为有了副业 即使我们没了工作也会有一定的生活保障 2021年适合做的副业有哪些 2021年做什么副业挣钱呢 第一类 体力类 1 餐饮兼职 虽然收入比较低
  • JAVA数据脱敏

    为了保护用户隐私 需要对敏感信息进行脱敏处理 如 姓名 电话号码 身份证 基于jackson 通过自定义注解的方式实现数据脱敏 添加依赖 spring web spring boot starter web已经集成了jackson相关包 不
  • Windows 环境下,nginx 配置文件上传大小

    问题描述 今天将刚刚和前端对接的文件上传功能 部署到公司的测试环境 提示如下错误信息 413 Request Entity Too Large 解决方法如下 1 打开nginx配置文件 nginx conf 路径一般是 E nginx 1
  • 《数据库系统概论》课程之实验五流六

    前序 数据库系统概论 课程之实验五 通过嵌入式SQL访问数据库 1实验目的 熟悉通过嵌入式SQL 主语言为C语言 编程访问数据库 实验以C语言为例作说明 实作可以选择任意语言实现本实验 2实验平台和实验工具 在KingbaseES数据库管理
  • oracle 如何修改表空间,ORACLE修改表空间方法

    1 使用imp exp 先导出源库 再建立新库把表空间建立好 而后再导入 听说这样能够 前提是新的库里面不能有与源库相同名字的表空间 有待验证 2 使用脚本进行修改 据目前所了解 正长状况下须要修改表的空间和表的索引的空间 若是涉及到BOL
  • 【OJ比赛日历】快周末了,不来一场比赛吗? #09.09-09.15 #15场

    CompHub 1 实时聚合多平台的数据类 Kaggle 天池 和OJ类 Leetcode 牛客 比赛 本账号会推送最新的比赛消息 欢迎关注 以下信息仅供参考 以比赛官网为准 目录 2023 09 09 周六 5场比赛 2023 09 10
  • 常用宏定义运算

    define DLT x y x gt y x y y x define MIN x y x gt y y x define MAX x y x gt y x y define EQU x y DLT x y
  • 更改 Python 的 pip install 默认使用的pip库以及默认安装路径

    时间 2018 10 07 题目 更改 Python 的 pip install 默认使用的pip库以及默认安装路径 目录 一 更改 Python 的 pip install 默认使用的pip库 二 更改 Python 的 pip inst
  • OJ# 384 敲七

    题目描述 有 N 个人在玩一种 敲7 游戏 游戏的规则是这样的 第 x 个人从 t 开始报数 然后按顺序报数 当某人报的数是 7 的倍数或数字中含有 7 时 便被淘汰 剩下的人继续报数 直到只剩下一个人 现求最终剩下的人编号 输入 一行三个
  • 示例:Scala读取xml文件

    test xml内容如下
  • RestTemplate使用JSON发送Post请求

    RestTemplate使用JSON发送Post请求 本文我们说下如何使用Spring的 RestTemplate调用post请求 发送json内容 1 定义服务端web接口 1 1 定义业务接口 先定义Person实体类表示post请求的
  • Unity+UWP+wIfi+电量

    听师傅说做这个得懂UWP 但素我不懂 不过也没关系啦 谁叫我我有个棒棒哒师傅呐 参考资料 https docs microsoft com en us uwp api windows devices wifi wifiavailablene
  • 2018年年终总结

    终于迎来了又一个寒假 又到了年终总结的时候了 其实这份总结 应该是12月31号就该写了 但想着实验室年会总要梳理一遍 一直拖着没写 然而年会的总感觉太过于学术 还是希望能写一份个人的总结 为今年画上一个句号 总归少了点仪式感 但是晚来的总比
  • Phonegap 之 iOS银联在线支付(js调用ios端银联支付控件)

    Phonegap项目 做支付的时候 当把网站打包到ios或android端成app后 在app上通过wap调用银联在线存在一个问题 就是当从银联支付成功后 再从服务器返回到app客户端就很难实现 wap银联支付流程是这样 客户端 gt 服务