0.介紹預(yù)覽
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括池州網(wǎng)站建設(shè)、池州網(wǎng)站制作、池州網(wǎng)頁(yè)制作以及池州網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,池州網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到池州省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
針對(duì)需要在IOS手機(jī)上接入原生微信支付場(chǎng)景,調(diào)用微信進(jìn)行支付。如圖:
1.資料準(zhǔn)備
1.1 賬號(hào)注冊(cè)
打開(kāi)https://open.weixin.qq.com,注冊(cè)微信開(kāi)放平臺(tái)開(kāi)發(fā)者賬號(hào)
1.2 開(kāi)發(fā)者認(rèn)證
登錄,進(jìn)入賬號(hào)中心,進(jìn)行開(kāi)發(fā)者資質(zhì)認(rèn)證。
1.3 注冊(cè)應(yīng)用
認(rèn)證完成后,進(jìn)入管理中心,新建移動(dòng)應(yīng)用。填寫應(yīng)用資料,其中android版應(yīng)用簽名可通過(guò)掃碼安裝溫馨提供的應(yīng)用獲得,詳細(xì)參考微信文檔。創(chuàng)建完成后點(diǎn)擊查看,申請(qǐng)開(kāi)通微信支付。一切準(zhǔn)備就緒!
2.Java后臺(tái)開(kāi)發(fā)
添加依賴
<!-- 微信支付依賴 --> <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>
生成統(tǒng)一訂單
@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 = "訂單標(biāo)題"; String body = "訂單描述"; int acc = (int) (Double.valueOf(account) * 100); String appid = "您的APPID"; String out_trade_no = "生成您的訂單號(hào)"; // 生成訂單數(shù)據(jù) 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.返回?cái)?shù)據(jù) 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,到商戶平臺(tái)查看"); paraMap.put("nonce_str", create_nonce_str()); paraMap.put("notify_url", "http://pay.xxxxx.com/pay/wxpay/notify.htm ");// 此路徑是微信服務(wù)器調(diào)用支付結(jié)果通知路徑 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); // 統(tǒng)一下單 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); // 預(yù)付商品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,到商戶平臺(tái)查看"); 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; } //請(qǐng)求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客戶端開(kāi)發(fā)
導(dǎo)入微信開(kāi)發(fā)包
添加URL Types
在AppDelegate.m中注冊(cè)應(yīng)用
#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]; // 進(jìn)入主控制器 self.window = [[UIWindow alloc] init]; self.window.frame = [UIScreen mainScreen].bounds; self.window.rootViewController = [[XSTabBarViewController alloc] init]; [self.window makeKeyAndVisible]; //向微信注冊(cè)應(yīng)用。 [WXApi registerApp:@"wxfb96c2a9b531be26"]; return YES; } -(void) onResp:(BaseResp*)resp { // NSLog(@" ----onResp %@",resp); /* ErrCode ERR_OK = 0(用戶同意) ERR_AUTH_DENIED = -4(用戶拒絕授權(quán)) ERR_USER_CANCEL = -2(用戶取消) code 用戶換取access_token的code,僅在ErrCode為0時(shí)有效 state 第三方程序發(fā)送時(shí)用來(lái)標(biāo)識(shí)其請(qǐng)求的唯一性的標(biāo)志,由第三方程序調(diào)用sendReq時(shí)傳入,由微信終端回傳,state字符串長(zhǎng)度不能超過(guò)1K lang 微信客戶端當(dāng)前語(yǔ)言 country 微信用戶當(dāng)前國(guó)家信息 */ if ([resp isKindOfClass:[SendAuthResp class]]) //判斷是否為授權(quán)請(qǐng)求,否則與微信支付等功能發(fā)生沖突 { SendAuthResp *aresp = (SendAuthResp *)resp; if (aresp.errCode== 0) { // NSLog(@"code %@",aresp.code); [[NSNotificationCenter defaultCenter] postNotificationName:@"wechatDidLoginNotification" object:self userInfo:@{@"code":aresp.code}]; } }else{ // 支付請(qǐng)求回調(diào) //支付返回結(jié)果,實(shí)際支付結(jié)果需要去微信服務(wù)器端查詢 NSString *strMsg = [NSString stringWithFormat:@"支付結(jié)果"]; NSString *respcode = @"0"; switch (resp.errCode) { case WXSuccess: strMsg = @"支付結(jié)果:成功!"; // NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode); respcode = @"1"; break; default: strMsg = [NSString stringWithFormat:@"支付結(jié)果:失??!retcode = %d, retstr = %@", resp.errCode,resp.errStr]; // NSLog(@"錯(cuò)誤,retcode = %d, retstr = %@", resp.errCode,resp.errStr); respcode = @"0"; break; } [[NSNotificationCenter defaultCenter] postNotificationName:@"wechatDidPayNotification" object:self userInfo:@{@"respcode":respcode}]; } } //iOS 9.0 之前的處理方法不保證正確,如有錯(cuò)誤還望指正 - (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]; }
向服務(wù)器端獲取統(tǒng)一訂單,并拉起微信進(jìn)行支付
-(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:@"跳轉(zhuǎn)中,請(qǐng)稍候"]; [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]; // 調(diào)用微信支付 PayReq *request = [[PayReq alloc] init]; /** 商家向財(cái)付通申請(qǐng)的商家id */ request.partnerId = [userDict objectForKey:@"partnerid"]; /** 預(yù)支付訂單 */ request.prepayId= [userDict objectForKey:@"prepayid"]; /** 商家根據(jù)財(cái)付通文檔填寫的數(shù)據(jù)和簽名 */ request.package = [userDict objectForKey:@"package"]; /** 隨機(jī)串,防重發(fā) */ request.nonceStr= [userDict objectForKey:@"noncestr"]; /** 時(shí)間戳,防重發(fā) */ request.timeStamp= [[userDict objectForKey:@"timestamp"] intValue]; /** 商家根據(jù)微信開(kāi)放平臺(tái)文檔對(duì)數(shù)據(jù)做的簽名 */ 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(@"發(fā)生錯(cuò)誤!%@",error); }]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperation:operation]; } // 微信支付結(jié)果 -(void)wechatDidPayNotification:(NSNotification *)notification { // NSLog(@"wechatDidPayNotification"); NSDictionary *nameDictionary = [notification userInfo]; NSString *respcode = [nameDictionary objectForKey:@"respcode"]; if([respcode isEqualToString:@"1"]){ // 支付成功,更新用戶信息 [self payDidFinish]; }else{ // 支付失敗, [self setupAlertControllerWithTitle:@"微信支付結(jié)果" messge:@"本次支付未完成,您可以稍后重試!" confirm:@"好的"]; } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
本文名稱:微信APP支付(IOS手機(jī)端+java后臺(tái))版
標(biāo)題網(wǎng)址:http://aaarwkj.com/article0/ijheio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、網(wǎng)站內(nèi)鏈、外貿(mào)建站、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站改版、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)