Maison > Article > Applet WeChat > Explication détaillée du code de cas de développement de paiement iOS WeChat
Cet article présente principalement en détail le cas de développement du paiement iOS WeChat, qui a une certaine valeur de référence. Les amis intéressés peuvent s'y référer
Le paiement WeChat présente de nombreux pièges et les documents officiels sont fournis. Il n'est pas exhaustif. du tout, et la démo est également "timide" et difficile à comprendre. De nombreux détails auxquels on avait prêté attention n’ont pas été reflétés et de nombreux détours ont été effectués. Par conséquent, le processus de développement du système est le suivant. (La démo complète est jointe à la fin du blog) Cela inclut le traitement de compatibilité du développement des paiements WeChat et du client d'appel de développement Alipay. (Les deux signatures sont placées côté mobile. Le blog ne mentionne pas la situation de non-installation du client WeChat. Il est également très simple d'en juger par la valeur de retour de 0 lors de l'appel de cette méthode [WXApi sendReq:request].)
1. Configuration de l'environnement
1. Le premier est l'accès au protocole https, définissez la liste blanche dans plist
2. Lorsque vous avez Pour le partage, la collecte, le paiement, la connexion, etc. WeChat, vous devez ajouter le code suivant (LSApplicationQueriesSchemes) dans "Info.plist"
3 . Résolvez le problème de la compilation du bitcode
4. Définir les types d'URL
5. de la démo officielle de WeChat)
6. Importer les bibliothèques de dépendances du système
7. 🎜>
Le paiement WeChat est divisé en Unité, c'est-à-dire que si le montant de votre paiement est maintenu à deux décimales, le montant du paiement doit être de *100 avant d'être envoyé à la plateforme de paiement WeChat, et ainsi de suite pour les autres . 2. Développement de code1. Opérations requises à l'entrée du programme (c'est-à-dire applegate.m) 2. Méthode proxy, sinon le service client WeChat ne sera pas rappelé (également dans le fichier délégué.m) Fonction de rappel pour un paiement WeChat réussi C'est nécessaire Pour expliquer, le document officiel explique ceci : Le résultat d'un paiement réussi du côté du service client ne peut pas être directement considéré comme le résultat d'un paiement de commande réussi. Il doit être basé sur le statut de la commande renvoyé par le serveur. , une fois le paiement réussi du côté du service client, WeChat Pay La plateforme enverra un message de paiement réussi au serveur, modifiera l'état de la commande en arrière-plan et le renverra au client. Le plus simple est que si le paiement réussit, une notification doit être envoyée à un contrôleur de vue spécifique (un contrôleur de vue avec fonction de paiement WeChat), afin que ce contrôle de vue spécifique puisse demander l'état de la commande du serveur.Cette fonction de rappel doit être écrite en délégué.m !!!
4. Code pour un contrôleur de vue spécifique (contrôleur de vue avec fonction de paiement WeChat)
4.1 Soumettre un ordre de prépaiement pour obtenir l'identifiant de précommande (ce processus doit être signé deux fois, c'est-à-dire sans paramètres ni signature). . Bien entendu, ces méthodes ont été encapsulées dans la classe payRequsestHandler. Il suffit de passer les paramètres pour appeler la méthode.) C'est aussi la méthode d'action pour cliquer sur le bouton de paiement
4.2 Après avoir reçu la commande prépayée, vous pouvez ajuster le côté service client du paiement WeChat (les codes 4.2 et 4.1 sont consécutifs)
Deux packages indépendants avec signature de paramètre de signe La méthode n'est pas encapsulée par payRequsestHandler. Je l'ai écrite moi-même. Des problèmes sont survenus lors de son utilisation (la capture d'écran du problème est la suivante, prenez d'abord une capture d'écran du code, puis fournissez un bloc de code qui peut être directement copié et). collé.
Capture d'écran du problème : (Je crois que beaucoup de gens ont rencontré ce problème. J'y suis allé, c'est à 100 % un problème de signe)
Première méthode. :
Méthode deux :
4.3 Le code ci-dessus peut résoudre complètement le problème de paiement WeChat. La dernière étape est. à gauche. Le paiement est réussi et revient à l'application pour appeler la méthode -(void)onResp:(BaseResp*)resp du délégué. Nous devons donc ici envoyer une notification à un contrôleur de vue spécifique et le laisser demander l'état de la commande en arrière-plan. Ce que je veux expliquer ici, c'est qu'après avoir ajusté WeChat Pay depuis cette interface, vous serez toujours au même endroit à votre retour. C'est juste que la méthode de rappel doit être dans le délégué, donc une notification réussie doit être envoyée dans la méthode de rappel. Ensuite, vous devez écouter cette notification dans la méthode de la vue spécifique du contrôleur de vue qui est sur le point d'apparaître, puis demander l'état de la commande en arrière-plan. Ce qu'il faut noter ici, c'est que la méthode dealloc doit être réécrite pour supprimer la notification.
3. Traitement de compatibilité des méthodes proxy des clients de rappel de paiement Alipay et WeChat
4. Démo
Copier et coller le code (signer la signature)
-(NSString )createMD5SingForPay:(NSString )appid_key partnerid:(NSString)partnerid_key prepayid:(NSString )prepayid_key package:(NSString )package_key noncestr:(NSString)noncestr_key timestamp:(UInt32)timestamp_key { NSMutableDictionary *signParams = [NSMutableDictionary dictionary]; [signParams setObject:appid_key forKey:@”appid”]; [signParams setObject:noncestr_key forKey:@”noncestr”]; [signParams setObject:package_key forKey:@”package”]; [signParams setObject:partnerid_key forKey:@”partnerid”]; [signParams setObject:prepayid_key forKey:@”prepayid”]; [signParams setObject:[NSString stringWithFormat:@”%u”,(unsigned int)timestamp_key] forKey:@”timestamp”]; NSMutableString *contentString =[NSMutableString string]; NSArray *keys = [signParams allKeys]; //按字母顺序排序 NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { return [obj1 compare:obj2 options:NSNumericSearch]; }]; //拼接字符串 for (NSString *categoryId in sortedArray) { if ( ![[signParams objectForKey:categoryId] isEqualToString:@”“] && ![[signParams objectForKey:categoryId] isEqualToString:@”sign”] && ![[signParams objectForKey:categoryId] isEqualToString:@”key”] ) { [contentString appendFormat:@”%@=%@&”, categoryId, [signParams objectForKey:categoryId]]; } } //添加商户密钥key字段 [contentString appendFormat:@”key=%@”, @”这里填写商户密钥”]; NSString *result = [self md5:contentString]; return result; }//创建发起支付时的sige签名 -(NSString ) md5:(NSString )str { const char *cStr = [str UTF8String]; unsigned char result[16]= “0123456789abcdef”; CC_MD5(cStr, (CC_LONG)strlen(cStr), result); //这里的x是小写则产生的md5也是小写,x是大写则md5是大写,这里只能用大写,微信的大小写验证很逗 return [NSString stringWithFormat: @”%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X”, result[0], result[1], result[2], result[3], result[4], result[5], result[6], result[7], result[8], result[9], result[10], result[11], result[12], result[13], result[14], result[15] ]; }//MD5 加密
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!