在Ionic应用里实现支付并不难,但是有的坑真是不爬不知道。

一:支付宝支付

网上关于支付宝支付cordova插件真是非常多,但是大多会报一些让你很无语的错误。比如sdk早已过时不是最新的,或者没有出来效果。我也是经过大量试错,最终选择了以下这个。

安装cordova支付宝支付插件:

ionic cordova plugin add cordova-plugin-alipay-v2 --variable APP_ID=xxxxxxxxxxx

让用户选择支付方式

openPayActionSheet(data) {
this.actionSheetCtrl.create({
buttons: [
{
text: "支付宝支付",
handler: () => {
this.aliPay(data);
}
},
{
text: "微信支付",
handler: () => {
this.weiXinPay(data);
}
},
{
text:"取消",
role: 'cancel'
}
]
}).present(); }

调用后台的签名方法,返回给你签名字符串,这个后台如果不知道怎么签名的话,阿里官方文档有详细的介绍。

unescapeHTML(a){
let aNew = "" + a;
return aNew.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&").replace(/&quot;/g, '"').replace(/&apos;/g, "'");
} aliPay(sn){
$.post('http://www.uhunche.cn/index.php?c=api&a=index',{
api:'alipay',
order_sn:sn
},(data)=>{
let payInfo=this.unescapeHTML(data);
cordova.plugins.alipay.payment(payInfo,(success)=>{
success.resultStatus==="9000"?this.paySuccess(sn): this.payFailed();
//支付成功
this.paySuccess();
},(error)=>{
//支付失败
this.payFailed();
});
});
}

这个unescapeHTML方法就是我在此坑了两天的成果,因为我们后台返回的签名字符串里面的&符号默认是实体字符串的,但是安卓和ios的sdk会默认对其格式化成&符号,而我们的js插件代码并没有做这个事情,所以我直接上传的签名字符串一直是实体字符串,所以传上去的不是&符号,一直调起不了支付宝。而把我们的签名字符串给支付宝的客服测试,是可以通过的,就因为他们是用原生应用demo测试的,默认做了这件事情。 
这样支付成功之后就会调后台写的回调方法,订单的状态就会改变了。

二:微信支付

是的,又是经过大量的试错,我选择了这个cordova插件,我们只是使用其中的微信支付方法,像微信分享等其他功能在这个插件也能实现的。

安装cordova支付宝支付插件:

ionic cordova plugin add cordova-plugin-wechat --variable wechatappid=xxxxxxxxxx

我们稍微对这个插件的方法简单封装一下

declare var Wechat: any;  // 此处声明plugin.xml中clobbers对应的值
export interface WechatPayParam {
partnerid: string;
prepayid: string;
noncestr: string;
timestamp: string;
sign: string;
} export class WechatPlugin { public static isInstalled() {
return new Promise((resolve, reject) => {
Wechat.isInstalled(result => {
resolve(result);
}, error => {
reject(error);
});
});
} public static sendPaymentRequest(params: WechatPayParam) {
return new Promise((resolve, reject) => {
Wechat.sendPaymentRequest(params, result => {
resolve(result);
}, error => {
reject(error);
});
});
}
}

调用后台的签名方法

 weiXinPay(sn){
this.httpService.postPHPWithLoading({
api:'wxpay',
order_sn:sn
}).subscribe(
payResult=>{
console.log(payResult); var params = {
partnerid:payResult.partnerid, // merchant id
prepayid: payResult.prepayid, // prepay id
noncestr: payResult.noncestr, // nonce
timestamp: payResult.timestamp+"", // timestamp
sign: payResult.sign // signed string
};
WechatPlugin.sendPaymentRequest(params).then((result)=>{
//支付成功
this.paySuccess()
},(error)=>{
//支付失败
this.payFailed()
})
}
) }

这里的一个坑就是插件要求时间戳timestamp必须是字符串类型,但是一般后台返回的时间戳都是number类型。所以要对其处理一下。另外微信支付要求每次支付的支付订单号都是不同的,那么当我们使用用户下单的订单号作为支付订单号的时候,如果进行支付并没有支付而取消了,下次再对这笔订单进行支付是会失败的,所以后台应该在每次支付都保证支付订单号是唯一的。

原文直通车

转《基于Ionic3实现微信支付和支付宝支付》的更多相关文章

  1. 转《在浏览器中使用tensorflow.js进行人脸识别的JavaScript API》

    作者 | Vincent Mühle 编译 | 姗姗 出品 | 人工智能头条(公众号ID:AI_Thinker) [导读]随着深度学习方法的应用,浏览器调用人脸识别技术已经得到了更广泛的应用与提升.在 ...

  2. face-api.js:一个在浏览器中进行人脸识别的 JavaScript 接口

    Mark! 本文将为大家介绍一个建立在「tensorflow.js」内核上的 javascript API——「face-api.js」,它实现了三种卷积神经网络架构,用于完成人脸检测.识别和特征点检 ...

  3. TensorFlow.js之安装与核心概念

    TensorFlow.js是通过WebGL加速.基于浏览器的机器学习js框架.通过tensorflow.js,我们可以在浏览器中开发机器学习.运行现有的模型或者重新训练现有的模型. 一.安装     ...

  4. 在Java中直接调用js代码(转载)

    http://blog.csdn.net/xzyxuanyuan/article/details/8062887 JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码. 在Ja ...

  5. 第十一章:WEB浏览器中的javascript

    客户端javascript涵盖在本系列的第二部分第10章,主要讲解javascript是如何在web浏览器中实现的,这些章节介绍了大量的脚本宿主对象,这些对象可以表示浏览器窗口.文档树的内容.这些章节 ...

  6. 在Java中直接调用js代码

    JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码. 在Java中直接调用js代码 不能调用浏览器中定义的js函数,会抛出异常提示ReferenceError: “alert ...

  7. TensorFlow.js入门(一)一维向量的学习

    TensorFlow的介绍   TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tensor(张量)意味着N维数组,Flow(流)意味着 ...

  8. JavaScript权威指南--WEB浏览器中的javascript

    知识要点 1.客户端javascript window对象是所有客户端javascript特性和API的主要接入点.它表示web浏览器的一个窗口或窗体,并且可以用window表示来引用它.window ...

  9. 解决webkit浏览器中js方法中使用window.event提示未定义的问题

    这实际上是一个浏览器兼容性问题,根源百度中一大堆,简要说就是ie中event对象是全局变量,所以哪里都能使用到,但是webkit内核的浏览器中却不存在这个全局变量event,而是以一个隐式的局部变量的 ...

  10. JS Date当前时间:获取日期时间方法在各浏览器中的差异

    转自:http://www.feiesoft.com/00047/<script type="text/javascript"> // JS Date当前时间获取方法在 ...

随机推荐

  1. 16.ajax_case02

    # 抓取当当网书评 # http://product.dangdang.com/25340451.html import json import requests from lxml import e ...

  2. NET缓存框架CacheManager在混合式开发框架中的应用(1)-CacheManager的介绍和使用

    在我们开发的很多分布式项目里面(如基于WCF服务.Web API服务方式),由于数据提供涉及到数据库的相关操作,如果客户端的并发数量超过一定的数量,那么数据库的请求处理则以爆发式增长,如果数据库服务器 ...

  3. .Net使用RabbitMQ详解 转载http://www.cnblogs.com/knowledgesea/p/5296008.html

    .Net使用RabbitMQ详解   序言 这里原来有一句话,触犯啦天条,被阉割!!!! 首先不去讨论我的日志组件怎么样.因为有些日志需要走网络,有的又不需要走网路,也是有性能与业务场景的多般变化在其 ...

  4. Spring Security(二十四):6.6 The Authentication Manager and the Namespace

    The main interface which provides authentication services in Spring Security is the AuthenticationMa ...

  5. Python脱产8期 Day05 2019/4/17

    数据类型的使用 一 数字类型 1.整型:int 2.浮点型:float 3.重点:数字类型直接相互转化 二字符串类型 一 1.定义:在单引号/双引号/三引号中包含一系列字符. 2.注意:可以通过引号的 ...

  6. item 23: 理解std::move和std::forward

    本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 根据std::move和std::forward不 ...

  7. linux使用.net core 创建简单的MVC

    1 创建MVC 2.修改默认绑定的端口方法 ,在Program.cs 的Build之前加入 .UseUrls("http://*:8888")

  8. day96

    在服务器上部署上线项目 Linux数据库处理 首先我们需要在mysql中创建bbs库,并导入数据库SQL脚本(就是原本运行在我们项目中的数据库) 前提:需要进入mysql中 mysql> cre ...

  9. 跨平台Redis可视化工具Web Redis Manager

    一.简介 最近因为工作需要,使用了一些单机版Redis的界面化管理工具,使用过程中那惨痛的体验真的只有用过的人才能体会:为此本人和小伙伴准备动手一个Redis可视化工具,但是因为小伙伴最近工作比较忙, ...

  10. C# 设置最顶层窗口。TopMostWindow

    code: namespace LOLMM { /// <summary> /// Interaction logic for MainWindow.xaml /// </summa ...