欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

微信APP支付(IOS手機端+java后臺)版

 更新時間:2019年05月05日 09:37:11   作者:只要你能好  
這篇文章主要為大家詳細介紹了微信APP支付(IOS手機端+java后臺)版,具有一定的參考價值,感興趣的小伙伴們可以參考一下

0.介紹預覽

針對需要在IOS手機上接入原生微信支付場景,調(diào)用微信進行支付。如圖:

1.資料準備

1.1 賬號注冊

打開https://open.weixin.qq.com,注冊微信開放平臺開發(fā)者賬號

1.2 開發(fā)者認證

登錄,進入賬號中心,進行開發(fā)者資質(zhì)認證。

1.3 注冊應用

認證完成后,進入管理中心,新建移動應用。填寫應用資料,其中android版應用簽名可通過掃碼安裝溫馨提供的應用獲得,詳細參考微信文檔。創(chuàng)建完成后點擊查看,申請開通微信支付。一切準備就緒!

2.Java后臺開發(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 = "訂單標題";
   String body = "訂單描述";
 
   int acc = (int) (Double.valueOf(account) * 100);
   String appid = "您的APPID";
   String out_trade_no = "生成您的訂單號";
  // 生成訂單數(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.返回數(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,到商戶平臺查看");
  paraMap.put("nonce_str", create_nonce_str());
  paraMap.put("notify_url", "http://pay.xxxxx.com/pay/wxpay/notify.htm ");// 此路徑是微信服務器調(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);
 
  // 預付商品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客戶端開發(fā)

導入微信開發(fā)包

添加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(用戶拒絕授權(quán))
  ERR_USER_CANCEL = -2(用戶取消)
  code 用戶換取access_token的code,僅在ErrCode為0時有效
  state 第三方程序發(fā)送時用來標識其請求的唯一性的標志,由第三方程序調(diào)用sendReq時傳入,由微信終端回傳,state字符串長度不能超過1K
  lang 微信客戶端當前語言
  country 微信用戶當前國家信息
  */
 if ([resp isKindOfClass:[SendAuthResp class]]) //判斷是否為授權(quán)請求,否則與微信支付等功能發(fā)生沖突
 {
  SendAuthResp *aresp = (SendAuthResp *)resp;
  if (aresp.errCode== 0)
  {
   //   NSLog(@"code %@",aresp.code);
   [[NSNotificationCenter defaultCenter] postNotificationName:@"wechatDidLoginNotification" object:self userInfo:@{@"code":aresp.code}];
  }
 }else{ // 支付請求回調(diào)
  //支付返回結(jié)果,實際支付結(jié)果需要去微信服務器端查詢
  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(@"錯誤,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];
}

向服務器端獲取統(tǒng)一訂單,并拉起微信進行支付

-(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)中,請稍候"];
 [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];
  /** 商家向財付通申請的商家id */
  request.partnerId = [userDict objectForKey:@"partnerid"];
  /** 預支付訂單 */
  request.prepayId= [userDict objectForKey:@"prepayid"];
  /** 商家根據(jù)財付通文檔填寫的數(shù)據(jù)和簽名 */
  request.package = [userDict objectForKey:@"package"];
  /** 隨機串,防重發(fā) */
  request.nonceStr= [userDict objectForKey:@"noncestr"];
  /** 時間戳,防重發(fā) */
  request.timeStamp= [[userDict objectForKey:@"timestamp"] intValue];
  /** 商家根據(jù)微信開放平臺文檔對數(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ā)生錯誤!%@",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:@"好的"];
 }
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java中ConcurrentHashMap的讀操作為什么不需要加鎖

    java中ConcurrentHashMap的讀操作為什么不需要加鎖

    ConcurrentHashMap完全允許多個讀操作并發(fā)進行,讀操作并不需要加鎖。所以下面這篇文章主要給大家介紹了關(guān)于java中ConcurrentHashMap的讀操作為什么不需要加鎖的相關(guān)資料,需要的朋友可以參考下
    2018-10-10
  • springcloud-alibaba 配置多環(huán)境管理使用詳解

    springcloud-alibaba 配置多環(huán)境管理使用詳解

    本文通過實際案例詳細介紹了springboot配置多環(huán)境管理的使用,以及基于nacos的配置多環(huán)境管理的實踐,在實際開發(fā)中,配置多環(huán)境管理是一個很難避開的問題,同時也是微服務治理中一個很重要的內(nèi)容,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • 5個步驟讓你明白多線程和線程安全

    5個步驟讓你明白多線程和線程安全

    本文詳細講解了多線程和線程安全的實現(xiàn),文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • JAVA語言編程格式高級規(guī)范

    JAVA語言編程格式高級規(guī)范

    這篇文章主要介紹了JAVA語言編程格式高級規(guī)范,需要的朋友可以參考下
    2015-05-05
  • Mybatis配置之typeAlias標簽的用法

    Mybatis配置之typeAlias標簽的用法

    這篇文章主要介紹了Mybatis配置之typeAlias標簽的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 如何獲取java新IO的Path文件大小

    如何獲取java新IO的Path文件大小

    這篇文章主要介紹了如何獲取java新IO的Path文件大小,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • SpringBoot響應處理之以Json數(shù)據(jù)返回的實現(xiàn)方法

    SpringBoot響應處理之以Json數(shù)據(jù)返回的實現(xiàn)方法

    這篇文章主要介紹了SpringBoot整合Web開發(fā)其中Json數(shù)據(jù)返回的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-09-09
  • Java中的繼承詳情

    Java中的繼承詳情

    這篇文章主要介紹了Java中的繼承詳情,繼承是面向?qū)ο笕筇卣髦?,可以使得子類具有父類的屬性和方法,還可以在子類中重新定義,以及追加屬性和方法,下文介紹需要的朋友可以參考下
    2022-04-04
  • 基于spring-security 401 403錯誤自定義處理方案

    基于spring-security 401 403錯誤自定義處理方案

    這篇文章主要介紹了基于spring-security 401 403錯誤自定義處理方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java兩種單例模式用法分析

    java兩種單例模式用法分析

    這篇文章主要介紹了java兩種單例模式用法,結(jié)合實例形式對比分析了java實現(xiàn)單例模式的兩種常見技巧,需要的朋友可以參考下
    2016-08-08

最新評論