微信支付-b

微信支付

APP端开发步骤(传送门):https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5



1.首先下载最新的微信支付的SDK包.下载地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1,拖到你的工程文件中.

简要步骤如下:

1.配置APPID

APPID要在微信开放平台申请.(让公司去注册.)

targets -> info -> URL Types

配置APPID.png

配置完是这样的

identifier 要使用 "weixin"

配置APPID2.png

2.在appDelegate引入微信lib,和头文件.

#import "WXApi.h"#import "WXApiManager.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    //向微信注册APPID    
    [WXApi registerApp:@"wxb4ba3c02aa476ea1" withDescription:@"demo 2.0"];    return YES;
}

3.调起微信支付

微信支付需第一次调通统一下单接口 prepayId,sign,nonceStr,timeStamp分别是微信预支付ID,签名,随机字符串,还有时间戳.

建议 "统一下单"由服务器端调用,然后客户端调用 支付接口.
因为 客户端生成随机字符串,还有签名,终端ip等等在客户端做并不妥当,并且一些商品的描述信息,商户的订单号还是要从服务器那边获取.

- (void)wxPay{    
    NSString *res = [self jumpToBizPay];    
    if( ![@"" isEqual:res] ){        
        UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"支付失败" message:res delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];          
        [alter show];    
    }
}
- (NSString *)jumpToBizPay {    //============================================================    
    // V3&V4支付流程实现    
    // 注意:参数配置请查看服务器端Demo    
    // 更新时间:2015年11月20日    
    //============================================================//    self.wxPayURL = @"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=ios";    
    //解析服务端返回json数据    
    NSError *error;    //加载一个NSURL对象    
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:self.wxPayURL]];    //将请求的url数据放到NSData对象中    
    NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];    
    if ( response != nil) {        
        NSMutableDictionary *dict = NULL;        //IOS5自带解析类NSJSONSerialization从response中解析出数据放到字典中        
        dict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];        

        NSLog(@"url:%@",self.wxPayURL);        
        if(dict != nil){            
            NSMutableString *retcode = [dict objectForKey:@"retcode"];            
            if (retcode.intValue == 0){                
                NSMutableString *stamp  = [dict objectForKey:@"timestamp"];                //调起微信支付                
                PayReq* req             = [[PayReq alloc] init];                
                req.partnerId           = [dict objectForKey:@"partnerid"];                
                req.prepayId            = [dict objectForKey:@"prepayid"];                
                req.nonceStr            = [dict objectForKey:@"noncestr"];                
                req.timeStamp           = stamp.intValue;                
                req.package             = [dict objectForKey:@"package"];                
                req.sign                = [dict objectForKey:@"sign"];                
                [WXApi sendReq:req];                //日志输出                
                NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",[dict objectForKey:@"appid"],req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign );                return @"";            
             }else{                
                 return [dict objectForKey:@"retmsg"];            
             }        
        }else{            
            return @"服务器返回错误,未获取到json对象";        
        }    
    }else{        
        return @"服务器返回错误";    
    }
}

这里注意: 一大堆代码都是为了获取 到这些参数.这里的代码是微信返回的参数,实际参数我们可以从公司服务器中请求接口获取.

PayReq* req             = [[PayReq alloc] init];    
req.partnerId           = [dict objectForKey:@"partnerid"];    
req.prepayId            = [dict objectForKey:@"prepayid"];    
req.nonceStr            = [dict objectForKey:@"noncestr"];    
req.timeStamp           = stamp.intValue;    
req.package             = [dict objectForKey:@"package"];    
req.sign                = [dict objectForKey:@"sign"];

字段 package 暂时是固定的 @"Sign=WXPay"就行.partnerId 是微信支付分配的商户号 申请的时候就有的.固定即可

获取完成之后调用

[WXApi sendReq:req];

剩下的就只有支付结果的回调了.

请求参数列表:

请求参数列表.png

4.支付回调结果

a.回到 appDelegate中
遵循代理

@interface AppDelegate () <WXApiDelegate>

b.当调用微信支付返回的时候.我们做的就是要在

- (BOOL) application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
判断是否成功调起微信支付.

- (BOOL) application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{    BOOL result = [WXApi handleOpenURL:url delegate:self]; //判断调起微信支付是否成功    
    if (result) {        
        return result;    
    }    
    return NO;  
}

c.实现代理方法

/**  
 *  微信的回调. (代理方法.)  
 */
-(void) onResp:(BaseResp*)resp{    
    if([resp isKindOfClass:[SendMessageToWXResp class]]){        
        strTitle = [NSString stringWithFormat:@"发送媒体消息结果"];    
    }    
    if([resp isKindOfClass:[PayResp class]]){        
        //支付返回结果,实际支付结果需要去微信服务器端查询        
        strTitle = [NSString stringWithFormat:@"支付结果"];        //控制器接收通知就OK!        
        switch (resp.errCode) {            
            case WXSuccess:{                
                strMsg = @"支付结果:成功!";   //微信文档有提到 一定不能用客户端的返回值做标准,实际支付结果应该去服务器查询的结果为准.                  
                [[NSNotificationCenter defaultCenter] postNotificationName:@"WXPaySuccess" object:@"success"];                
                break;            
             }            
            default:{                
                 NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);                //                
                 [[NSNotificationCenter defaultCenter] postNotificationName:@"WXPayFailed" object:@"fail"];                
                break;            
            }        
        }    
    }  
}

支付回调结果,应该在去服务器查询.安全起见 结果一致,才显示支付成功! (有一些没说明清楚的麻烦指正.)
这里还是有一个坑的,微信会向服务器在固定的频率发送支付成功的回调,有可能 2s, 有可能3秒这样的.也就是说,支付成功之后回来的时候从服务器查询可能还残留着上一次的支付状态.(没有更新过来,需要缓几秒). 在这个频率之间去请求的话可能会出现结果不一致的情况.而且我觉得微信做的支付并不专业,用过其他几个支付平台的就知道,支付结果的回调的时候,会反回一些 有关的订单信息,或者订单状态等.以供查询,而微信只返回了一些状态码,如果还想查询其他信息话需要做另外的操作.

文/uncleRX(简书作者)
原文链接:http://www.jianshu.com/p/0782dcec99d7

时间: 2024-10-18 10:01:58

微信支付-b的相关文章

微信支付PHP SDK —— 公众号支付代码详解

在微信支付 开发者文档页面 下载最新的 php SDK http://mch.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 这里假设你已经申请完微信支付 1. 微信后台配置  如图 我们先进行测试,所以先把测试授权目录和 测试白名单添加上.测试授权目录是你要发起微信请求的哪个文件所在的目录. 例如jsapi 发起请求一般是jsapi.php所在目录 为测试目录,测试白名单即开发人员的微信号. 正式的支付授权目录不能和测试的一样否则会报错.不填

微信支付之JSAPI公众号支付

前提 本教程默认以下几点你已经完全满足: 开通了认证后的服务号 服务号开通的微信支付的认证 腾讯给你的邮件中有商户登录的账号和密码 拥有一个可供上传代码和设置回调域名的网站或云服务 有一点点php知识. 第一步:公众号设置 1. 你的公众号,在支付认证的标签下, 内容应该和下图类似.证明公众号已经完成了认证和合约的签署. 2. 然后在微信支付–开发配置中,设置测试授权目录和测试白名单 3. 在公众号设置-功能设置标签中,设置JS接口安全域名,这个域名在认证获取token的过程中可能会用到.但具体

微信支付错误两个问题的解决:curl出错,错误码:60

如下是运行微信支付测试代码时出错代码: Warning: curl_setopt() expects parameter 2 to be long, string given in D:\wwwroot\weixinpaytest\pay\WxPay.JsApiPay.php on line 99 Fatal error: Uncaught exception 'WxPayException' with message 'curl出错,错误码:60' in D:\wwwroot\weixinpa

H5版如何在微信外(非微信浏览器)进行微信支付技术方案

官方是支持在非微信内置浏览器中调起微信支付的!H5支付是基于公众号基础开发的一种非微信内浏览器支付方式(需要单独申请支付权限),可以满足在微信外的手机H5页面进行微信支付的需求.同时,由于H5链接传播十分方便.来源不易追踪,商户需要特别注意做好防钓鱼.防刷单的处理,控制风险. 流程原理 接口说明 (1)用户打开商户H5网页选购商品,生成支付订单:(2)商户调用[统一下单]接口(接口中trade_type需定义为WAP),获得预支付交易会话标识prepayid:(3)商户按照微信H5支付协议生成d

微信公众号可通过现金红包接口发放微信支付现金红包(附开发教程)

农历新年将至,支付宝红包打了一仗,微信在朋友圈屏蔽了它的分享,但单防守还不行,进攻才是最好的防守.昨日,微信支付现金红包接口正式开放,只需开通微信支付,即可接入现金红包.微信公众号也可以发放现金红包了! 通过现金红包接口,公众号开发者可以策划相关运营活动,向用户发放微信支付现金红包,更好的达到品牌推广及回馈用户的效果. 1.商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,这样的方式,允许商户灵活的应用于各种各样丰富的活动场景 2.领取到红包后,用户的资金直接进入微信零钱,避免繁复的领

微信支付

后台 public ActionResult WxAddVoucher_Center(double money) { int money= int.Parse((money * 100).ToString()); String ip = Request.UserHostAddress; //随机商品ID String id = ""; Random rd = new Random(); for (int i = 1; i < 16; i++) { id += (rd.Next(0

Unity3d接入微信支付sdk返回-1

背景:U3d导出安卓项目包之后,进行SDK的接入工作. 由于习惯性的右键->Run As->Android Application生成安卓包,导致没有对apk进行签名.App装入之后,微信支付老是返回-1,翻来覆去的找问题终于找到正确的操作流程: 之后,点击finish即可.

C#开发微信支付之企业向用户付款

1.企业付款的介绍 所谓企业付款指的是,在功能开放后诸如保险行业的客户理赔.退保.商品退款.发放征集活动奖金.抽奖互动等操作都可以通过企业付款完成.而此前,微信支付只能提供客户向企业单向付款. 商户如果需要给用户付款,可以直接将钱打入用户的"微信零钱"中,微信支付将做零钱入账消息通知,零钱收支明细会展示相应记录.针对无零钱账户的历史客户端版本,资金将进入用户的红包账户,微信支付无消息通知用户,企业可选择自行触达用户. 通过认证的企业号可以开通微信支付功能.通过认证的企业号可以管理平台的

微信支付get_brand_wcpay_request:fail

最近做了微信支付功能,和后端一起踩坑中,微信一直报错:get_brand_wcpay_request:fail 前端js部分实现方法: 1.利用微信js sdk实现.调起微信js SDK,并注入事件chooseWXPay 2.利用内置对象 刚开始我采用第一种方法,一直报错后我采用第二种方法,发现还是报错后,我求助了度娘. 出现该问题的原因: 1.生成的sign签名有问题 2.支付授权目录配置有问题 在经过仔细的检查,后端也重新生成了签名后,这个问题还是存在.折腾了几天没有解决,发邮件咨询了微信官

微信支付 chooseWXPay:fail

本来以为解决了微信支付get_brand_wcpay_request:faill这个问题后就万事大吉了,结果又迈入了另一个坑... 问题原因: 1.生成签名的时间戳参数名timestamp的s大小写问题 js的参数在这里是小写的timestamp wx.chooseWXPay({   timestamp: "1234567890",     .... } }); 2.MD5一定要大写 3.package参数设置 之前的package参数是我前段自己拼接的:'package':  'pr