2018-06-22 17:57:18 tym3515 阅读数 612
  • Cocos Creator水果机游戏项目客户端实战教程

    课程目标: 掌握Cocos Creator游戏开发的基本过程,能独立完成游戏项目的设计与开发。适用人群希望学习和了解手机游戏、H5游戏、网络游戏的初学者。想要开发自己的一款小游戏,并且部署到服务器上。 注意:本项目是客户端开发,后续会推出服务端开发的课程。如果大家对课里面的内容有疑问,可以在评论区留言。 为什么选择cocos creater:  Cocos Creator 目前支持发布游戏到 Web、iOS、Android、各类"小游戏"、PC 客户端等平台,真正实现一次开发,全平台运行。其编辑器  完全为引擎定制打造,包含从设计、开发、预览、调试到发布的整个工作流所需的全功能一体化编辑器。很方便。门槛低,学习成本低。 为什么强烈建议推荐本套课程:   1.从0开始一点点敲的代码,由浅入深,深入剖析   2.生产环境Linux部署,减少弯路,一步到位   3. 老师每天上线答疑,让同学少走弯路   4. 实战商业化项目,学习价值很高 项目开发的功能: 本项目具有一定商业化价值。学习本项目我们将开发如下功能: 1.客户端-注册功能,token登录功能 2.客户端大厅功能,包含高分场,低分场 3.客户端好友功能,邮件列表功能,金币转换,排行榜功能 4.小三元动画,小满贯动画,跳远动画,普通开奖动画,旋转动画等 5.Nginx+阿里云部署,H5打包,域名申请 6.客户端http和websocket与后台通信,心跳协议 游戏项目部分截图展示: 后台展示:(本课程只介绍客户端,后续会推出服务端的课程,使用python开发) 免责声明: 素材均是网络搜集,本项目仅用于教学,请勿商用。

    322 人正在学习 去看看 于长海

 

微信开发者工具:

当前系统代理不是安全代理?

命令行输入regedit或按快捷键win+R然后输入regedit,打开注册表编辑器------通过下面的路径打开

HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Internet Settings

这时把里面所有的Proxy开头的项都删除掉,如ProxyEnable,ProxyOverride

 

    删除后电脑一定要注销或者重启

 

微信分享ios:

1,分享配置的参数link中如果有变量,不能是中文如果有中文就会在ios失效,安卓没毛病;

2,imgurl必须是固定的字符串


 
    wx.ready(function(){
        wx.hideMenuItems({
            menuList: ["menuItem:share:qq",
            'menuItem:share:QZone',
            "menuItem:editTag",
            "menuItem:delete",
            "menuItem:copyUrl","menuItem:openWithQQBrowser","menuItem:openWithSafari"]
            // 要隐藏的菜单项,只能隐藏“传播类”和“保护类”按钮,所有menu项见附录3 
        });

        wx.onMenuShareAppMessage({
            title: '', // 分享标题
            desc: '', // 分享描述
            link: location.protocol+'//'+location.host+'/', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: '', // 分享图标
            type: 'link', // 分享类型,music、video或link,不填默认为link
            dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
            success: function () {
                // 用户点击了分享后执行的回调函数
                // alert('分享')
            }
        });
        wx.onMenuShareTimeline({//分享到朋友圈
            title: '', // 分享标题
            link: location.protocol+'//'+location.host+'/', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl:'',// 分享图标
        });   
      

    });

 

2017-08-03 17:08:18 u012131769 阅读数 1934
  • Cocos Creator水果机游戏项目客户端实战教程

    课程目标: 掌握Cocos Creator游戏开发的基本过程,能独立完成游戏项目的设计与开发。适用人群希望学习和了解手机游戏、H5游戏、网络游戏的初学者。想要开发自己的一款小游戏,并且部署到服务器上。 注意:本项目是客户端开发,后续会推出服务端开发的课程。如果大家对课里面的内容有疑问,可以在评论区留言。 为什么选择cocos creater:  Cocos Creator 目前支持发布游戏到 Web、iOS、Android、各类"小游戏"、PC 客户端等平台,真正实现一次开发,全平台运行。其编辑器  完全为引擎定制打造,包含从设计、开发、预览、调试到发布的整个工作流所需的全功能一体化编辑器。很方便。门槛低,学习成本低。 为什么强烈建议推荐本套课程:   1.从0开始一点点敲的代码,由浅入深,深入剖析   2.生产环境Linux部署,减少弯路,一步到位   3. 老师每天上线答疑,让同学少走弯路   4. 实战商业化项目,学习价值很高 项目开发的功能: 本项目具有一定商业化价值。学习本项目我们将开发如下功能: 1.客户端-注册功能,token登录功能 2.客户端大厅功能,包含高分场,低分场 3.客户端好友功能,邮件列表功能,金币转换,排行榜功能 4.小三元动画,小满贯动画,跳远动画,普通开奖动画,旋转动画等 5.Nginx+阿里云部署,H5打包,域名申请 6.客户端http和websocket与后台通信,心跳协议 游戏项目部分截图展示: 后台展示:(本课程只介绍客户端,后续会推出服务端的课程,使用python开发) 免责声明: 素材均是网络搜集,本项目仅用于教学,请勿商用。

    322 人正在学习 去看看 于长海

微信APP支付(IOS手机端+java后台)版

0.介绍预览

针对需要在IOS手机上接入原生微信支付场景,调用微信进行支付。如图:

         

1.资料准备

1.1 账号注册

打开https://open.weixin.qq.com,注册微信开放平台开发者账号

1.2 开发者认证

登录,进入账号中心,进行开发者资质认证。

 

1.3 注册应用

认证完成后,进入管理中心,新建移动应用。填写应用资料,其中android版应用签名可通过扫码安装温馨提供的应用获得,详细参考微信文档。创建完成后点击查看,申请开通微信支付。一切准备就绪!

 

 

 


2.Java后台开发

添加依赖

<!-- 微信支付依赖 -->
<dependency>
    <groupId>org.xmlpull</groupId>
    <artifactId>xmlpull</artifactId>
    <version>1.1.3.1 </version>
</dependency>
<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.3</version>
    <classifier>jdk15</classifier>
</dependency>
<!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.ning/async-http-client -->
<dependency>
    <groupId>com.ning</groupId>
    <artifactId>async-http-client</artifactId>
    <version>1.8.13</version>
</dependency>


 

生成统一订单

   @RequestMapping(value="/pay/wxpay/params",produces="application/json;charset=utf-8")
    @ResponseBody
    public String signprams(HttpServletRequest request){
        String res = "{code:404}";
        try{
	    // 充值金额
            String account = request.getParameter("account");
	    // 用户id
            String sid = request.getParameter("sid");
            String subject = "订单标题";
            String body = "订单描述";

            int acc = (int) (Double.valueOf(account) * 100);
            String appid = "您的APPID";
            String out_trade_no = "生成您的订单号";
	    // 生成订单数据
            SortedMap<String, String> payMap = genOrderData(request, subject, body, acc, appid, out_trade_no);

            savePayLog(out_trade_no,account,sid,body,payMap.get("paySign"),nid,2);

            // 4.返回数据
            res = buildPayRes(payMap,out_trade_no);
        }catch (Exception e){
            e.printStackTrace();
            res = "{code:500}";
        }
        return res;
    }

    private SortedMap<String, String> genOrderData(HttpServletRequest request, String subject, String body,
                                       int acc, String appid, String out_trade_no)
            throws IOException, ExecutionException, InterruptedException, XmlPullParserException {
        SortedMap<String, String> paraMap = new TreeMap<String, String>();
        paraMap.put("appid", appid);
        paraMap.put("attach", subject);
        paraMap.put("body", body);
        paraMap.put("mch_id", "您的商户id,到商户平台查看");
        paraMap.put("nonce_str", create_nonce_str());
        paraMap.put("notify_url", "http://pay.xxxxx.com/pay/wxpay/notify.htm ");// 此路径是微信服务器调用支付结果通知路径
        paraMap.put("out_trade_no", out_trade_no);
        paraMap.put("spbill_create_ip", request.getRemoteAddr());
        paraMap.put("total_fee", acc+"");
        paraMap.put("trade_type", "APP");
        String sign = createSign(paraMap);
        paraMap.put("sign", sign);
        // 统一下单 https://api.mch.weixin.qq.com/pay/unifiedorder 
        String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
        String xml = getRequestXml(paraMap);
        String xmlStr = HttpKit.post(url, xml);

        // 预付商品id
        String prepay_id = "";
        if (xmlStr.indexOf("SUCCESS") != -1) {
            Map<String, String> map = WXRequestUtil.doXMLParse(xmlStr);
            prepay_id = (String) map.get("prepay_id");
        }

        SortedMap<String, String> payMap = new TreeMap<String, String>();
        payMap.put("appid", appid);
        payMap.put("partnerid", "您的商户id,到商户平台查看");
        payMap.put("prepayid", prepay_id);
        payMap.put("package", "Sign=WXPay");
        payMap.put("noncestr", create_nonce_str());
        payMap.put("timestamp", WXRequestUtil.create_timestamp());
        String paySign = createSign(payMap);
        payMap.put("paySign", paySign);
        return payMap;
    }

    //请求xml组装  
    public static String getRequestXml(SortedMap<String,String> parameters){  
    	String sign = "";
          StringBuffer sb = new StringBuffer();  
          sb.append("<xml>");  
          Set es = parameters.entrySet();  
          Iterator it = es.iterator();  
          while(it.hasNext()) {  
              Map.Entry entry = (Map.Entry)it.next();  
              String key = (String)entry.getKey();  
              String value = (String)entry.getValue();  
//              if ("attach".equalsIgnoreCase(key)||"body".equalsIgnoreCase(key)||"sign".equalsIgnoreCase(key)) {  
//                  sb.append("<"+key+">"+value+"</"+key+">");  
//              }
              if ("sign".equalsIgnoreCase(key)){
            	  sign = "<"+key+">"+value+"</"+key+">";
              }else {  
                  sb.append("<"+key+">"+value+"</"+key+">");  
              }  
          }  
          sb.append(sign);  
          sb.append("</xml>");  
          return sb.toString();  
      } 

    //生成签名  
    public String createSign(SortedMap<String,String> parameters){  
          StringBuffer sb = new StringBuffer();  
          Set es = parameters.entrySet();  
          Iterator it = es.iterator();  
          while(it.hasNext()) {  
              Map.Entry entry = (Map.Entry)it.next();  
              String k = (String)entry.getKey();  
              Object v = entry.getValue();  
              if(null != v && !"".equals(v)  
                      && !"sign".equals(k) && !"key".equals(k)) {  
                  sb.append(k + "=" + v + "&");  
              }  
          }  
          sb.append("key=" + WXConfig.APP_PERTNER_KEY);  
          System.out.println(sb.toString());
          String sign = MD5Utils.MD5Encode(sb.toString(),"UTF-8").toUpperCase();  
          return sign;  
      } 


	public String create_nonce_str() {
		String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
		String res = "";
		for (int i = 0; i < 32; i++) {
			Random rd = new Random();
			res += chars.charAt(rd.nextInt(chars.length() - 1));
		}
		return res;
	}


 

3.IOS客户端开发

导入微信开发包

 

添加URL Types

 

AppDelegate.m中注册应用

#import "AppDelegate.h"
#import "XSTabBarViewController.h"
#import <AlipaySDK/AlipaySDK.h>
#import "WXApi.h"

@interface AppDelegate ()<WXApiDelegate>

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
//    [NSThread sleepForTimeInterval:2.0];
    
    // 进入主控制器
    self.window = [[UIWindow alloc] init];
    self.window.frame = [UIScreen mainScreen].bounds;
    self.window.rootViewController = [[XSTabBarViewController alloc] init];
    
    [self.window makeKeyAndVisible];
    
    //向微信注册应用。
    [WXApi registerApp:@"wxfb96c2a9b531be26"];
    
    return YES;
}

-(void) onResp:(BaseResp*)resp
{
//        NSLog(@" ----onResp %@",resp);
    /*
     ErrCode ERR_OK = 0(用户同意)
     ERR_AUTH_DENIED = -4(用户拒绝授权)
     ERR_USER_CANCEL = -2(用户取消)
     code    用户换取access_token的code,仅在ErrCode为0时有效
     state   第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用sendReq时传入,由微信终端回传,state字符串长度不能超过1K
     lang    微信客户端当前语言
     country 微信用户当前国家信息
     */
    if ([resp isKindOfClass:[SendAuthResp class]]) //判断是否为授权请求,否则与微信支付等功能发生冲突
    {
        SendAuthResp *aresp = (SendAuthResp *)resp;
        if (aresp.errCode== 0)
        {
            //            NSLog(@"code %@",aresp.code);
            [[NSNotificationCenter defaultCenter] postNotificationName:@"wechatDidLoginNotification" object:self userInfo:@{@"code":aresp.code}];
        }
    }else{  // 支付请求回调
        //支付返回结果,实际支付结果需要去微信服务器端查询
        NSString *strMsg = [NSString stringWithFormat:@"支付结果"];
        NSString *respcode = @"0";
        switch (resp.errCode) {
            case WXSuccess:
                strMsg = @"支付结果:成功!";
                //                NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
                respcode = @"1";
                break;
            default:
                strMsg = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
                //                NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
                respcode = @"0";
                break;
        }
        [[NSNotificationCenter defaultCenter] postNotificationName:@"wechatDidPayNotification" object:self userInfo:@{@"respcode":respcode}];
    }
}


//iOS 9.0 之前的处理方法不保证正确,如有错误还望指正
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    NSLog(@"iOS 9.0 之前");
    return [self applicationOpenURL:url];
}

-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
    NSLog(@"iOS 9.0 之后");
    return [self applicationOpenURL:url];
}

- (BOOL)applicationOpenURL:(NSURL *)url
{
    if([[url absoluteString] rangeOfString:@"wxfb96c2a9b531be26://pay"].location == 0){
        return [WXApi handleOpenURL:url delegate:self];
    }
    if ([url.host isEqualToString:@"safepay"])
    {
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:nil];
        return YES;
    }
    return YES;
}

}



在需要支付的Controller中接受微信支付通知

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 接受微信支付通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(wechatDidPayNotification:) name:@"wechatDidPayNotification" object:nil];
}


 

向服务器端获取统一订单,并拉起微信进行支付

-(void)weixinPay
{
    NSString *userUrlStr = [NSString stringWithFormat:@"%@?sid=%@&account=%@&desc=%@", WX_PREPAY_URL, self.student.sid,self.payJinE,self.student.nid];
    NSURL *url = [NSURL URLWithString:userUrlStr];
//     NSLog(@"userUrlStr = %@", userUrlStr);
    
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request];
    
    [MBProgressHUD showMessage:@"跳转中,请稍候"];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, NSDictionary *responseObject) {
        [MBProgressHUD hideHUD];
        
//         NSLog(@"微信支付的response = %@", operation.responseString);
        NSData *JSONData = [operation.responseString dataUsingEncoding:NSUTF8StringEncoding];
        NSDictionary *userDict = [NSJSONSerialization JSONObjectWithData:JSONData options:NSJSONReadingMutableLeaves error:nil];
        
        // 调用微信支付
        PayReq *request = [[PayReq alloc] init];
        /** 商家向财付通申请的商家id */
        request.partnerId = [userDict objectForKey:@"partnerid"];
        /** 预支付订单 */
        request.prepayId= [userDict objectForKey:@"prepayid"];
        /** 商家根据财付通文档填写的数据和签名 */
        request.package = [userDict objectForKey:@"package"];
        /** 随机串,防重发 */
        request.nonceStr= [userDict objectForKey:@"noncestr"];
        /** 时间戳,防重发 */
        request.timeStamp= [[userDict objectForKey:@"timestamp"] intValue];
        /** 商家根据微信开放平台文档对数据做的签名 */
        request.sign= [userDict objectForKey:@"sign"];
        self.sign = request.sign;
        self.ordnum = [userDict objectForKey:@"ordnum"];
        

        [WXApi sendReq: request];
    }failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        [MBProgressHUD hideHUD];
        NSLog(@"发生错误!%@",error);
    }];
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperation:operation];
    
}
// 微信支付结果
-(void)wechatDidPayNotification:(NSNotification *)notification
{
//    NSLog(@"wechatDidPayNotification");
    NSDictionary *nameDictionary = [notification userInfo];
    NSString *respcode = [nameDictionary objectForKey:@"respcode"];
    if([respcode isEqualToString:@"1"]){
        // 支付成功,更新用户信息
        [self payDidFinish];
    }else{
        // 支付失败,
        [self setupAlertControllerWithTitle:@"微信支付结果" messge:@"本次支付未完成,您可以稍后重试!" confirm:@"好的"];
    }
}


 

 

 

 

 

 

 

 

 

 

2017-12-07 15:32:46 msyqmsyq 阅读数 577
  • Cocos Creator水果机游戏项目客户端实战教程

    课程目标: 掌握Cocos Creator游戏开发的基本过程,能独立完成游戏项目的设计与开发。适用人群希望学习和了解手机游戏、H5游戏、网络游戏的初学者。想要开发自己的一款小游戏,并且部署到服务器上。 注意:本项目是客户端开发,后续会推出服务端开发的课程。如果大家对课里面的内容有疑问,可以在评论区留言。 为什么选择cocos creater:  Cocos Creator 目前支持发布游戏到 Web、iOS、Android、各类"小游戏"、PC 客户端等平台,真正实现一次开发,全平台运行。其编辑器  完全为引擎定制打造,包含从设计、开发、预览、调试到发布的整个工作流所需的全功能一体化编辑器。很方便。门槛低,学习成本低。 为什么强烈建议推荐本套课程:   1.从0开始一点点敲的代码,由浅入深,深入剖析   2.生产环境Linux部署,减少弯路,一步到位   3. 老师每天上线答疑,让同学少走弯路   4. 实战商业化项目,学习价值很高 项目开发的功能: 本项目具有一定商业化价值。学习本项目我们将开发如下功能: 1.客户端-注册功能,token登录功能 2.客户端大厅功能,包含高分场,低分场 3.客户端好友功能,邮件列表功能,金币转换,排行榜功能 4.小三元动画,小满贯动画,跳远动画,普通开奖动画,旋转动画等 5.Nginx+阿里云部署,H5打包,域名申请 6.客户端http和websocket与后台通信,心跳协议 游戏项目部分截图展示: 后台展示:(本课程只介绍客户端,后续会推出服务端的课程,使用python开发) 免责声明: 素材均是网络搜集,本项目仅用于教学,请勿商用。

    322 人正在学习 去看看 于长海

这个文章写的 比较不错 借此转发。


 SDK下载:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=11_1

APP端开发步骤说明:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_5

SDK接入

服务器签名版本

官方已经是建议使用服务器签名来接入微信支付,实际上从安全上考虑,确实是每个客户端不应该知道RAS密钥,也不需要每个客户端都写一遍签名的算法。

服务端接入流程文档:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_3

商户系统和微信支付系统主要交互说明:

步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。

步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【统一下单API】。

步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay

步骤4:商户APP调起微信支付。api参见本章节【app端开发步骤说明

步骤5:商户后台接收支付通知。api参见【支付结果通知API

步骤6:商户后台查询支付结果。,api参见【查询订单API

1.导入SDK文件

2.导入相关的系统库及文件。不导入会报错。

  • SystemConfiguration.framework
  • libz.tbd 
  • libsqlite3.0.tbd
  • CoreTelephony.framework
  • libc++.tbd

3.配置info.plist

a.schemes ,注意,item0 这里要修改成商户自己的APPID

或者这样修改:

b.白名单

c.安全配置支持Http

当然这部分的配置,也可以通过修改XML来实现。

4.修改bitcode。

修改:

5.在AppDelegate 注册微信

导入#import "WXApiManager.h"

复制代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //向微信注册wxd930ea5d5a258f4f
    [WXApi registerApp:@"wxb4ba3c02aa476ea1" withDescription:@"demo 2.0"];
    
    return YES;
}

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    return  [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
复制代码

6.接下来,就是发起请求支付了,实现上核心代码只有几行。

这部分代码在demo的WXApiRequestHandler--》jumpToBizPay 里。

复制代码
                    //调起微信支付
                    PayReq* req             = [[[PayReq alloc] init]autorelease];
                    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];
复制代码

7.不管支付成功还是失败,结果会返回到WXApiManager--》onResp 方法下

复制代码
        switch (resp.errCode) {
            case WXSuccess:
                strMsg = @"支付结果:成功!";
                NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
                break;
                
            default:
                strMsg = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
                NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
                break;
        }
复制代码

我们直接处理回调结果即可。

客户端进行签名

1.导入文件。官方已经不提供这个SDK的下载了,我已经打包到源代码了,2015年3月11号最新修改的版本

 

2.里面有两个文件是非arc的,我们需要设置一下 -fno-objc-arc

3.导入系统库及info.list配置,请参数上面服务端签名。

4.AppDelegate配置

1)导入头文件

#import "WXApi.h"
#import "payRequsestHandler.h"

2)实现微信代理

@interface AppDelegate ()<WXApiDelegate>

@end

3)注册微信,及微信支付回调

复制代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    //向微信注册
    [WXApi registerApp:APP_ID withDescription:@"demo 2.0"];
    
    return YES;
}

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    return  [WXApi handleOpenURL:url delegate:self];
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    return  [WXApi handleOpenURL:url delegate:self];
}

// 微信支付成功或者失败回调
-(void) onResp:(BaseResp*)resp
{
    NSString *strMsg = [NSString stringWithFormat:@"errcode:%d", resp.errCode];
    NSString *strTitle;
    
    if([resp isKindOfClass:[SendMessageToWXResp class]])
    {
        strTitle = [NSString stringWithFormat:@"发送媒体消息结果"];
    }
    if([resp isKindOfClass:[PayResp class]]){
        //支付返回结果,实际支付结果需要去微信服务器端查询
        strTitle = [NSString stringWithFormat:@"支付结果"];
        
        switch (resp.errCode) {
            case WXSuccess:
                strMsg = @"支付结果:成功!";
                NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
                break;
                
            default:
                strMsg = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
                NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
                break;
        }
    }
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    [alert show];
}
复制代码

5.写方法直接在支付时调用

复制代码
- (void)payForWechat
{
    //创建支付签名对象
    payRequsestHandler *req = [[payRequsestHandler alloc] init];
    //初始化支付签名对象
    [req init:APP_ID mch_id:MCH_ID];
    //设置密钥
    [req setKey:PARTNER_ID];
    
    NSMutableDictionary *dict = [req sendPay_demo];
    
    if(dict != nil){
        NSMutableString *retcode = [dict objectForKey:@"retcode"];
        if (retcode.intValue == 0){
            NSMutableString *stamp  = [dict objectForKey:@"timestamp"];
            
            //调起微信支付
            PayReq* req             = [[PayReq alloc] init];
            req.openID              = [dict objectForKey:@"appid"];
            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=%@",req.openID,req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign );
        }else{
            [self alert:@"提示信息" msg:[dict objectForKey:@"retmsg"]];
        }
    }else{
        [self alert:@"提示信息" msg:@"服务器返回错误,未获取到json对象"];
    }
}

//客户端提示信息
- (void)alert:(NSString *)title msg:(NSString *)msg
{
    UIAlertView *alter = [[UIAlertView alloc] initWithTitle:title message:msg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    
    [alter show];
}
复制代码

最后,修改payRequsestHandler.h文件里的APP_ID 和MCH_ID即可使用。


原文地址:http://blog.csdn.net/mingenlong/article/details/52400409



没有更多推荐了,返回首页