在iOS9上调用支付宝不回调的问题解决,以及支付宝嵌入的流程梳理

2023-11-19

又有一段时间没有经营自己的博客了,这一段有点忙啊!

在最近的一个项目中再一次用到了第三方支付,对,就是支付宝,之前的项目其实已经实现过相应的功能,那是还是在ios8的系统下,这不在iOS9下就遇到了一个问题,不回调啊,反正要梳理支付宝的嵌入,那就先说说具体的流程吧。

我使用的支付宝SDK2.0标准版,下载相应的SDK时,除了会附带支付宝的Demo之外,还有一份文档“移动支付接口SDK2.0标准版接入和使用规则.pdf”,我们大概分3步来总结一下:

第一步:商户签约和秘钥配置;

第二步:SDK集成及xcode相关配置;

第三部:参数设置及相关调试;

接下来我们一步一步来说:

第一步:商户签约和秘要配置;

对于公司的业务一般是由公司申请企业支付宝账号,同时进行签约和相应的业务申请,这是公司该做的,作为开发者给我们的就是一组支付宝账号和密码,我们登录进去可以查看签约管理,示意图如下(注意一下我们进入之后,查看的是支付宝-商家服务,而不是支付宝-开放平台,商家服务可以理解为你为公司的支付宝签约的服务配置信息,而开放平台是给自己作为开发者用的,在开放平台中只能看到在商户服务中配置的信息)

点击查看 商户服务->签约管理->查看更多签约信息,之后则需要输入支付宝支付密码才能看见PID和Key等内容(支付宝付费账号是单独设置的,和登录密码不一定相同,试了3遍会被锁定的,最好事先确定一下),之后我们会看到这样一个界面:


这个界面就是我们获取PID和设置秘钥的地方;

接下来就是这个秘钥怎么配的问题了,如上图中所标注的,我们需要添加RSA加密的公钥,作为支付宝的公钥;

在我们下载的SDKDemo中有一个openssl的文件夹,其中包含了windows下的生成秘钥的工具,我是在Mac电脑上操作的,直接在终端上敲命令就行,在根目录下就会生成一组.pem格式的秘钥,一个是私钥,一个是公钥,再用命令生成PKCS8格式的私钥,会直接显示在终端上,保存到一个记事本里保存好,那现在我们手里就有了3个秘钥:

rsa_private_key.pem;

rsa_public_key.pem;

PKCS8编码之后的私钥(字符串);

其中,PKCS8编码之后的私钥会在app中作为参数privateKey传入,RSA加密的公钥就是前面我们说的要添加作为支付宝公钥的;

好了,第一步就完成了;


第二步:SDK集成及xcode相关配置:

对于继承的流程,文档上有很详尽的描述,一般我的做法就是把Demo中给的这几个文件拖进应用:

这个order类也是从Demo中拷出来的;

在导入SDK之后,还需要在Header Search Paths增加头文件路径,引入支持的系统库,Info-UIL Types中增加URL Schemes,同时还要进行ios9的适配,在Info plist文件中增加LSApplicationQueriesSchemes数组属性,增加两个值:alipay和alipayshare...反正就是正常做就行了;

这里完成了上述的步骤之后,run一下,发现竟然跑不了,报错了(是不是很郁闷!)

Undefined symbols for architecture armv7:
  "_OBJC_CLASS_$_UTDevice", referenced from:
      objc-class-ref in AlipaySDK
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
具体解决过程就不提了,在链接的系统库中增加CoreMotion.framework就好了。

这下可以编译通过了,第二步也完成了;


第三部:参数设置及相关调试:

按照Demo中的请求调用支付宝支付,我们需要若干参数:

partner:合作身份者ID,以2088开头,也就是前面我们提到的PID;

seller:商家的支付宝收款账号;

privateKey:还记得那个PKCS8格式的秘钥吗,对,就是他;

order.tradeNO:这个订单内容编码是最终要传给服务端的,其中根据不同的业务需求可能会传订单Id,用户Id,优惠券Id等信息,支付宝回调服务端之后,进行入库;

order.productName:可以作为产品业务名;

order.productionDescription:可以作为产品业务描述;

order.amount:这是最重要的“钱”,千万别算错了,会出大问题的,别问我是怎么知道的^_^;

order.notifyURL:这个是支付宝回调服务端的地址,找服务端要就行了;

appScheme:前面配置的URL Schemes中的字符串,写在这就行了;

这样参数就基本齐全了,很开心对吧,接下来就要处理回调了,需要在两个地方处理回调:

一个是进行支付时的callback的block回调,这个是调用SDK时的回调(没安装应用的);

另一个是appdelegate中的这个方法中:

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation
添加如下代码:

/**
         9000 订单支付成功 8000 正在处理中 4000 订单支付失败 6001 用户中途取消 6002 网络连接出错
         */
        //*支付宝
        //如果极简 SDK 不可用,会跳转支付宝钱包进行支付,需要将支付宝钱包的支付结果回传给 SDK
        if ([url.host isEqualToString:@"safepay"]) {
            
            [[AlipaySDK defaultService]processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
                [[NSNotificationCenter defaultCenter]postNotificationName:k_Noti_transeAlipayCallBackResault object:resultDic];
            }];
            [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
                NSLog(@"result = %@",resultDic);
                [[NSNotificationCenter defaultCenter]postNotificationName:k_Noti_transeAlipayCallBackResault object:resultDic];
            }];
        }
        if ([url.host isEqualToString:@"platformapi"]){//支付宝钱包快登授权返回 authCode
            [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {
                NSLog(@"result = %@",resultDic);
                [[NSNotificationCenter defaultCenter]postNotificationName:k_Noti_transeAlipayCallBackResault object:resultDic];
            }];
        }
这个是跳转到支付宝应用返回当前应用的回调处理,三个判断对应三种不同情况:其实正常的情况下只有第二个会走,第三个从url.host就可以看出来,是处理登录授权的(其他人都有这个判断,姑且放着吧),至于第一个判断我记得是如果应用被干掉,也会有回调,但是鉴于我对回调的处理方式是通过通知发回发起支付的界面,所以这个判断实际上也没什么意义;

在具体界面处理具体通知,根据不同的状态码处理就行了;

第三步也完成了,按照之前排练的进行付费,之后就等着能华丽丽的收场,结果...你错了,竟然不回调,对,就是不回调,瞬间好心情全没了^_^;

终端上只是孤零零的输出了“retryHandleOpenURL”

3步都完成了,就差回调的处理了,各种搜索,最后在简书上有个人处理了这个问题(毕竟人家是作者,把链接附在这了http://www.jianshu.com/p/3ce4561ae7be

解决的方法就是在iOS9下,这个方法才是可靠的

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options 
把上边的处理代码考到这个方法中一份就可以了^_^


感谢俊哥的帮助,使这篇博客成为了可能,谢谢!也希望对大家有帮助。



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

在iOS9上调用支付宝不回调的问题解决,以及支付宝嵌入的流程梳理 的相关文章

随机推荐

  • 【2022年MathorCup大数据竞赛】B题:北京移动用户体验影响因素研究(四)(问题一的千余行代码整理)

    目录 代码整理 一 问题一附件1语音业务数据集处理代码 二 问题一附件2上网业务数据集处理代码 一 问题一附件1语音业务数据集处理代码 问题一附件1语音业务数据集处理代码 import numpy as np import pandas a
  • 打包前后端项目并部署至服务器

    1 打包前端项目 打包命令 npm run build 执行完命令后 会生成一个名为 dist 的文件夹 这个就是打包好的前端项目 2 打包后端项目 2 1 执行 maven 的 clean 删除项目编译创建的 target 文件夹 2 2
  • fastcgi 模块各个常用变量的意义

    nginx fasrcgi 模块的文档 http nginx org en docs http ngx http fastcgi module html fastcgi pass 设置FastCGI服务器的地址 将匹配到该location的
  • C语言程序的结构

    1 C语言程序主要由函数构成 函数是C语言程序的基本单位 一个C语言源程序必须有一个main函数 可以包含一个main函数和若干个其他函数 主函数可以调用其他函数 其他函数之间可以互相调用 但其他函数不能调用主函数 被调用的函数可以是系统提
  • 时序算法研究系列之Prophet安装(准备篇)

    前言 新开一个关于时序数据预测算法的系列博客 计划整理目前的时序数列的预测方法 原理 应用 心得等 其中Prophet因为在安装时候踩了很多雷 所以专门开一个准备篇写安装过程 下一篇讲述具体应用 目录 前言 Prophet 简介 方法一 方
  • 查看字节码

    1 安装插件 ASM Bytecode outline 与hexview 2 查看字节码 源码 package com asm public class HelloWorld public static void main System o
  • 【华为OD机试真题 JAVA】求最多可以派出多少支团队

    JS版 华为OD机试真题 JS 求最多可以派出多少支团队 标题 求最多可以派出多少支团队 时间限制 1秒 内存限制 262144K 语言限制 不限 用数组代表每个人的能力 一个比赛活动要求参赛团队的最低能力值为N 每个团队可以由1人或2人组
  • Eclipse插件之Bytecode Outline

    本文介绍如何利用Eclipse插件Bytecode Outline在Eclipse中的操作使用 Eclipse是目前非常流行的开发平台 开放扩展的架构让很多程序员找到了自己个性化的工作环境 Bytecode Outline 插件可以把当前的
  • U盘安装ubuntu16.04及IP配置,硬盘挂载。

    U盘安装ubuntu16 04及IP配置 硬盘挂载 准备一个启动盘 进入BIOS 安装系统 设置静态ip 挂载硬盘脚本 安装基本包 准备一个启动盘 准备一个U盘 可以用 ultraiso 工具来制作 进入BIOS 将U盘插入要安装的电脑 开
  • 理解gateway网关,及与前端联调过程

    1 一些概念 客户端向Spring Cloud Gateway发出请求 然后在Gateway Handler Mapping中找到请求相匹配的路由 将其发送到Gateway Web Handler Handler再通过制定的过滤器链来将请求
  • NeRF神经辐射场中关于光线从世界坐标系转换为NDC坐标系 Representing Scenes as Neural Radiance Fields for View Synthesis

    本文旨在回复一个粉丝的关于坐标系变换编程提问 并结合下面的一个代码进行解释 完整代码参考我前面的文章 补充 希望那个同学可以看见 因为公众号对话10天未互动默认无法再回复消息了 def get ndc rays H W focal near
  • 两层及N层全连接神经网络模型原理

    两层及N层全连接神经网络模型原理 前言 1 两层MLP 1 1 前向传播 1 2 反向传播 2 N层MLP 2 1 网络参数 2 2 超参数优化 3 MLP优化 前言 深度学习是学习样本数据的内在规律和表示层次 在学习过程中获得的信息对诸如
  • 蓝桥杯最长不下降子序列,线段树python

    问题描述 给定一个长度为 N 的整数序列 A1 A2 AN 现在你有一次机会 将其 中连续的K 个数修改成任意一个相同值 请你计算如何修改可以使修改后的数 列的最长不下降子序列最长 请输出这个最长的长度 最长不下降子序列是指序列中的一个子序
  • 1+x 证书 Web 前端开发中级理论考试(试卷 6 )

    1 x 证书 Web 前端开发中级理论考试 试卷 6 官方QQ群 1 x 证书 web 前端开发初级对应课程分析 http blog zh66 club index php archives 194 1 X 证书 Web 前端开发中级对应课
  • 2022国赛5:神州路由器DHCP服务配置

    配置如下 RA配置 Router conf Router host RA RA config int g0 1 RA config g0 1 ip add 192 168 10 1 255 255 255 0 RA config g0 1
  • STM32+ESP8266+MQTT连接阿里云(1)

    ESP8266连接阿里云的流程 发送 目的是让ESP8266退出透传 AT RESTORE 让模块恢复出厂设置 AT 判断模块的好坏及工作状态 正常就会回复OK ATE0 关闭回显 这个没什么好说的 AT CWMODE CUR 1 设置为s
  • 【网络是怎样连接的】—— 向 DNS 服务器查询 IP 地址

    IP 1 基本知识 互联网和公司内部的局域网都是基于 TCP IP 的思路来设计的 由一些小的子网 通过路由器连接起来组成一个大的网络 这里的子网可以理解为用集线器连接起来的几台计算机 在网络中 所有的设备都会被分配一个地址 这个地址就相当
  • 设计模式学习笔记(一)之单例模式

    单例模式 作用 保证一个类只有一个实例 并且提供访问这个实例的全局访问点 应用场景有 数据库连接池 spring中 Bean默认是单例 Servlet中 每一个Servlet是单例 配置文件的类 一般是单例 优点 单例只生成一个实例 减少系
  • UVM实战——01基本概念_2 什么是UVM?

    什么是UVM 1 什么是UVM 2 UVM的特点 3 UVM提供的资源 3 1 编程指导 3 1 1 理念 3 1 2 功能 3 2 验证组件 3 3 验证激励 3 4 通信机制 3 5 宏 1 什么是UVM UVM Universal V
  • 在iOS9上调用支付宝不回调的问题解决,以及支付宝嵌入的流程梳理

    又有一段时间没有经营自己的博客了 这一段有点忙啊 在最近的一个项目中再一次用到了第三方支付 对 就是支付宝 之前的项目其实已经实现过相应的功能 那是还是在ios8的系统下 这不在iOS9下就遇到了一个问题 不回调啊 反正要梳理支付宝的嵌入