Acceso de pago de iOS WeChat y encapsulación de herramientas

WeChat Pay se utilizó en un proyecto que acaba de finalizar. Desde el acceso a WeChat Pay hasta la encapsulación de herramientas, lo resumiré en este artículo para uso futuro.

1. Inicie los preparativos para acceder al pago de WeChat

Proceso de acceso.png

En primer lugar, debe registrar una cuenta en la plataforma abierta WeChat . Quiero presentar una queja aquí. No conozco el mecanismo de verificación de cuenta y contraseña de esta plataforma WeChat. Si olvido mi contraseña anterior e inicio sesión nuevamente , todos los métodos para recuperar la contraseña no funcionarán. No tengo más remedio que registrar uno. Gmail.com, después de iniciar sesión correctamente, podrá ver la siguiente interfaz.
1.png

Haga clic en Crear aplicación móvil en la esquina superior derecha y complete la información necesaria paso a paso. No entraré en detalles innecesarios aquí.
Cabe señalar que el ID del paquete completado aquí
debe estar en correspondencia uno a uno con el proyecto.
Id. delimitado
Luego, espere aproximadamente una semana y, una vez aprobada la revisión de WeChat, podrá integrar el SDK de pago de WeChat en el Proyecto. Para más detalles, consulte los documentos oficiales .
Método de integración de pods.

pod 'WechatOpenSDK'

En Xcode, seleccione la configuración de su proyecto, seleccione la columna "OBJETIVOS" y agregue "esquema de URL" como su ID de aplicación registrada en el "tipo de URL" de la barra de pestañas "información" (como se muestra en la figura siguiente).
esquema de URL

Una vez completado, puede obtener el appid (el código de identificación único generado por la plataforma abierta WeChat para la aplicación), la identificación del comerciante y la clave secreta del comerciante. Para el lado de la aplicación, solo se usa el appid. La ID del comerciante se obtiene mejor del servidor a través de la interfaz. La clave secreta del comerciante se usa para la firma y, en general, solo el servidor puede usarla.

2. Proceso de pago

Proceso de pago.png

Este diagrama de flujo puede parecer complicado al principio, así que para resumir nuestro proceso comparativo:
1. El cliente de la aplicación envía una solicitud de pago al servidor
2. Después de recibir la solicitud del cliente, el servidor llama a la API de pedidos unificados al backend de WeChat y obtiene el información del pedido prepago
3. El servidor genera información de pago del cliente firmada para la aplicación
4. El usuario del cliente de la aplicación confirma el pago y la aplicación activa al cliente WeChat para realizar el pago
5. Después de que la aplicación obtiene el resultado del pago, consulta el servidor para el resultado final y mostrar

Trabajar en el lado de la aplicación:
  • Acceda al SDK de pago de WeChat
  • Enviar solicitud de pago al servidor
  • La información de pago activa la aplicación WeChat y luego realiza el pago.
  • Después de recibir la devolución de llamada de pago de WeChat, confirme el resultado del pago en el servidor
  • Mostrar la página de resultados según los resultados de la consulta para informar al usuario de los resultados del pago.
Trabajo del lado del servidor:
  • Después de recibir la solicitud de pago del cliente de la aplicación, solicite una orden de prepago desde el backend de WeChat.
  • El servidor firma y devuelve la información al cliente de la aplicación.
  • Reciba los resultados de pago devueltos por el fondo de WeChat y utilícelos para realizar consultas en el lado de la aplicación

Descripción del campo devuelto por el servidor:

  • appId: appid devuelto
  • ID de socio: 父级id
  • prepayId: identificación de pago
  • paquetes: nombre del paquete (el valor predeterminado para WeChat es "Sign=WXPay")
  • nonceStr: cadena aleatoria generada
  • timesTamp: marca de tiempo
  • signo: firma
    Campo Descripción

3. Usar en iOS

En AppDelegate.m, importe el archivo de encabezado del SDK de WeChatWXApi.h

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[WXApi registerApp:@"注册获得的appid"];//注册appid
    return YES;
}

 //支持所有iOS系统回调
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
//    [self handleOpenURL:url];
    BOOL result = [[UMSocialManager defaultManager] handleOpenURL:url sourceApplication:sourceApplication annotation:annotation];
    if (!result) {
        // 其他如支付等SDK的回调
        [self handleOpenURL:url];
    }
    return YES;
}
- (void)handleOpenURL:(NSURL*)url {
    if ([url.host isEqualToString:@"pay"]) { // -- 微信支付
        [WXApi handleOpenURL:url delegate:[WXPayService sharedInstance]];
    }
}

Lo que hay aquí WXPayServicees una clase que escribí por separado y sigue WXApiManagerDelegateel protocolo.

WXPayService.h
#import <Foundation/Foundation.h>
#import "WXApi.h"
@interface WXPayService : NSObject <WXApiDelegate>
///单例来接收微信请求的回调
+ (instancetype)sharedInstance;
// -- 根据接口返回的预支付信息,构造支付请求
+ (PayReq *)getPayRequest:(NSDictionary *)prepayData;

///处理非支付请求的回调
- (void)onRespCallBack:(void(^)(BaseResp * resp))callback;
///从服务器端获取到微信返回的支付请求用到的参数来发起支付请求
- (void)startPayWithReq:(PayReq *)req callback:(void(^)(BaseResp * resp))callback; 
@end
WXPayService.m

#import "WXPayService.h"
@interface WXPayService ()
@property (nonatomic,copy) void(^RespCallBack)(BaseResp *);
@end
static WXPayService *sharedInstance;

@implementation WXPayService
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [super allocWithZone:zone];
    });
    return sharedInstance;
}
///单例来接收微信请求的回调
+ (instancetype)sharedInstance {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

// -- 根据接口返回的预支付信息,构造支付请求
+ (PayReq *)getPayRequest:(NSDictionary *)prepayData {
    if (prepayData) {
//  此处Tools是自己的另一个工具类,用来判断字典的
        PayReq *req = [[PayReq alloc] init];
        if ([Tools dicContain:prepayData withKey:@"partnerid"]) {
            req.partnerId = prepayData[@"partnerid"];
        }
        if ([Tools dicContain:prepayData withKey:@"prepayid"]) {
            req.prepayId = prepayData[@"prepayid"];
        }
        if ([Tools dicContain:prepayData withKey:@"noncestr"]) {
            req.nonceStr = prepayData[@"noncestr"];
        }
        if ([Tools dicContain:prepayData withKey:@"timestamp"]) {
            req.timeStamp = [prepayData[@"timestamp"] intValue];
        }

        req.package =@"Sign=WXPay";
        req.sign =  @"null";
        //日志输出
        NSLog(@"appid=%@/npartid=%@/nprepayid=%@/nnoncestr=%@/ntimestamp=%ld/npackage=%@/nsign=%@",[prepayData objectForKey:@"appid"],req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign);
        return req;
    }
    return nil;
}

///处理非支付请求的回调
- (void)onRespCallBack:(void(^)(BaseResp * resp))callback {
    self.RespCallBack = callback;
}
///从服务器端获取到微信返回的支付请求用到的参数来发起支付请求
- (void)startPayWithReq:(PayReq *)req callback:(void(^)(BaseResp * resp))callback {
    NSAssert(req !=nil , @"未成功创建微信支付请求");
    self.RespCallBack = callback;
    if ([WXApi isWXAppInstalled]) { // -- 判断是否安装微信应用
        //发起微信支付,设置参数
        [WXApi sendReq:req];
    }else {
        self.RespCallBack(nil);
    }
}

#pragma mark WXApiDelegate
- (void)onResp:(BaseResp *)resp {
    if ([resp isKindOfClass:[PayResp class]]) { // -- 判断是否为支付的回调
        self.RespCallBack(resp);
    }
}
@end

Importe la clase de herramienta en ViewController que debe pagarseWXPayService
pagar.png

4. Puntos de atención y problemas

punto importante:

  • Configure el esquema; de lo contrario, la aplicación no podrá saltar al cliente WeChat
  • Los valores clave al firmar el pago están todos en minúsculas.
  • Si el pago muestra que la verificación de la firma falló
    , puede intentar configurar los paquetes con el valor predeterminado (Sign=WXPay)

pregunta:

Si la versión del sistema es mayor o igual a iOS9, después de iniciar el cliente WeChat, puede hacer clic directamente en el botón en el lado izquierdo de la barra de estado para regresar. En este momento, no se utiliza el método de devolución de llamada.

Solución:
en el método applicationWillEnterForeground de AppDelegate.m, llame a la interfaz de consulta de resultados de pago y luego actualice la página. Debe establecer una variable bool como indicador; de lo contrario, no cumplirá con los requisitos comerciales si la consulta cada vez que la aplicación ingresa al primer plano.

Después de ingresar a la página de pago de WeChat, cambie a su propia aplicación sin realizar ninguna operación, salga de la página de pago actual y luego ingrese al cliente de WeChat y haga clic en Pagar o Cancelar. En este momento, su aplicación fallará y se cerrará.

Motivo: después de salir de la página, la página se sacó de la pila y se destruyó, pero aún se llama al método proxy durante la devolución de llamada de wx y aparecerá un puntero comodín.
Solución: viewWillDisappearagregar al método de la página

[WXPayService sharedManager].delegate = nil;

5. Conclusión

Para las firmas de pago de WeChat, se recomienda negociar con el servidor una firma secundaria para garantizar la seguridad del pago.
PD: Si hay algún problema, critíqueme y corríjame. Además, revise mi blog personal.

Supongo que te gusta

Origin blog.csdn.net/chuzhaohzi/article/details/79804096
Recomendado
Clasificación