支付寶APP支付(IOS手機(jī)端+java后臺(tái))版
0.介紹預(yù)覽
針對(duì)需要在IOS手機(jī)上接入原生微信支付場(chǎng)景,調(diào)用微信進(jìn)行支付。如圖:
1.資料準(zhǔn)備
1.1 賬號(hào)注冊(cè)
打開https://openhome.alipay.com,注冊(cè)支付寶開放平臺(tái)開發(fā)者賬號(hào)
1.2 開發(fā)者認(rèn)證
登錄,進(jìn)入開發(fā)者中心,進(jìn)行開發(fā)者資質(zhì)認(rèn)證,并創(chuàng)建移動(dòng)應(yīng)用。
1.3 簽約應(yīng)用
創(chuàng)建應(yīng)用后上傳相關(guān)資料,上線應(yīng)用并通過審核。審核通過后點(diǎn)擊應(yīng)用,進(jìn)行簽約,此步驟不能省略,否則或報(bào)ISV權(quán)限不足。
1.4 應(yīng)用配置
打開應(yīng)用信息,配置一下內(nèi)容,接口簽名可下載支付寶簽名驗(yàn)簽工具進(jìn)行生成,生成完成后將公鑰復(fù)制到平臺(tái)上。
2.Java后臺(tái)開發(fā)
添加依賴
<!-- 支付寶支付依賴 --> <dependency> <groupId>com.pentahohub.nexus</groupId> <artifactId>alipay-sdk-java</artifactId> <version>20170615110434</version> <scope>system</scope> <systemPath>${basedir}/libs/alipay-sdk-java20170615110434.jar</systemPath> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.1</version> </dependency>
生成統(tǒng)一訂單
/** * account 總金額 * sid 用戶id * desc 節(jié)點(diǎn)id * @param request * @return */ @RequestMapping(value="/pay/alipay/signprams",produces="application/json;charset=utf-8") @ResponseBody public String signprams(HttpServletRequest request){ String res = "{code:404}"; try{ String totalAmount = request.getParameter("account"); String sid = request.getParameter("sid"); String nid = request.getParameter("desc"); String subject = "電費(fèi)充值"; String body = "貴大電費(fèi)預(yù)付費(fèi)充值"; String prefix = "ALE"+sid+"E"; String out_trade_no = WXRequestUtil.getTradeNo(prefix); //實(shí)例化客戶端 AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do ", AlipayUtil.APPID, AlipayUtil.PRIVATE_KEY, "json", AlipayUtil.CHARSET, AlipayUtil.PUBLIC_KEY, "RSA2"); //實(shí)例化具體API對(duì)應(yīng)的request類,類名稱和接口名稱對(duì)應(yīng),當(dāng)前調(diào)用接口名稱:alipay.trade.app.pay AlipayTradeAppPayRequest alirequest = new AlipayTradeAppPayRequest(); //SDK已經(jīng)封裝掉了公共參數(shù),這里只需要傳入業(yè)務(wù)參數(shù)。以下方法為sdk的model入?yún)⒎绞?model和biz_content同時(shí)存在的情況下取biz_content)。 AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); model.setPassbackParams(URLEncoder.encode(body.toString()));; //描述信息 添加附加數(shù)據(jù) model.setSubject(subject); //商品標(biāo)題 model.setOutTradeNo(out_trade_no); //商家訂單編號(hào) model.setTimeoutExpress("30m"); //超時(shí)關(guān)閉該訂單時(shí)間 model.setTotalAmount(totalAmount); //訂單總金額 model.setProductCode("QUICK_MSECURITY_PAY"); //銷售產(chǎn)品碼,商家和支付寶簽約的產(chǎn)品碼,為固定值QUICK_MSECURITY_PAY alirequest.setBizModel(model); alirequest.setNotifyUrl("http://pay.gzdxfszx.com/pay/alipay/notify.xs "); //回調(diào)地址 String orderStr = ""; try { //這里和普通的接口調(diào)用不同,使用的是sdkExecute AlipayTradeAppPayResponse response = alipayClient.sdkExecute(alirequest); orderStr = response.getBody(); // System.out.println(orderStr);//就是orderString 可以直接給客戶端請(qǐng)求,無需再做處理。 } catch (AlipayApiException e) { e.printStackTrace(); } String sign = MD5Encode.encode(out_trade_no); savePayLog(out_trade_no,totalAmount,sid,body, sign,nid,1); JSONObject resObj = new JSONObject(); resObj.put("code",ResponseCode.HTTP_SUCCESS); resObj.put("out_trade_no",out_trade_no); resObj.put("sign",sign); resObj.put("orderStr",orderStr); res = resObj.toJSONString(); }catch (Exception e){ e.printStackTrace(); } return res; }
異步通知處理
@RequestMapping(value="/pay/alipay/notify",produces="application/json;charset=utf-8") @ResponseBody public String notify(HttpServletRequest request){ Map requestParams = request.getParameterMap(); System.out.println("支付寶支付結(jié)果通知"+requestParams.toString()); //獲取支付寶POST過來反饋信息 Map<String,String> params = new HashMap<String,String>(); for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = (String) iter.next(); String[] values = (String[]) requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } //亂碼解決,這段代碼在出現(xiàn)亂碼時(shí)使用。 //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); params.put(name, valueStr); } //切記alipaypublickey是支付寶的公鑰,請(qǐng)去open.alipay.com 對(duì)應(yīng)應(yīng)用下查看。 //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type) try { //驗(yàn)證簽名 boolean flag = AlipaySignature.rsaCheckV1(params, AlipayUtil.PUBLIC_KEY, AlipayUtil.CHARSET, "RSA2"); if(flag){ if("TRADE_SUCCESS".equals(params.get("trade_status"))){ // //付款金額 // String amount = params.get("buyer_pay_amount"); // //支付寶交易號(hào) // String trade_no = params.get("trade_no"); // //附加數(shù)據(jù) // String passback_params = URLDecoder.decode(params.get("passback_params")); //商戶訂單號(hào) String out_trade_no = params.get("out_trade_no"); updateOrderInfo(out_trade_no,MD5Encode.encode(out_trade_no)); } } } catch (AlipayApiException e) { // TODO Auto-generated catch block e.printStackTrace(); } return "success"; }
3.IOS客戶端開發(fā)
導(dǎo)入支付寶開發(fā)包
添加URL Types
在需要調(diào)用支付寶的地方實(shí)現(xiàn)方法
-(void)aliPay { [MBProgressHUD showMessage:@"跳轉(zhuǎn)中,請(qǐng)稍候"]; NSString *appScheme = @"alisdkdemo"; NSString *userUrlStr = [NSString stringWithFormat:@"%@?sid=%@&account=%@&desc=%@", ALI_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]; [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]; NSString *orderString = [userDict objectForKey:@"orderStr"]; self.sign = [userDict objectForKey:@"sign"]; self.ordnum = [userDict objectForKey:@"out_trade_no"]; [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) { NSLog(@"reslut = %@",resultDic); [MBProgressHUD hideHUD]; NSString *resultStatus = [resultDic objectForKey:@"resultStatus"]; if([resultStatus isEqualToString:@"9000"]){ // 支付成功,更新用戶信息 [self payDidFinish]; }else{ // 支付失敗, [self setupAlertControllerWithTitle:@"支付寶支付結(jié)果" messge:@"本次支付未完成,您可以稍后重試!" confirm:@"好的"]; } }]; }failure:^(AFHTTPRequestOperation *operation, NSError *error) { [MBProgressHUD hideHUD]; NSLog(@"發(fā)生錯(cuò)誤!%@",error); }]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperation:operation]; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解java集成支付寶支付接口(JSP+支付寶20160912)
- java后臺(tái)實(shí)現(xiàn)支付寶支付接口和支付寶訂單查詢接口(前端為APP)
- Java實(shí)現(xiàn)支付寶之第三方支付寶即時(shí)到賬支付功能
- java實(shí)現(xiàn)在SSM下使用支付寶掃碼支付功能
- java后臺(tái)實(shí)現(xiàn)支付寶對(duì)賬功能的示例代碼
- Java判斷瀏覽器是微信還是支付寶
- Java開發(fā)支付寶PC支付完整版
- 微信、支付寶二碼合一掃碼支付實(shí)現(xiàn)思路(java)
- java實(shí)現(xiàn)支付寶退款功能
- Java接入支付寶授權(quán)第三方登錄的完整步驟
相關(guān)文章
一文教會(huì)你用mybatis查詢數(shù)據(jù)庫(kù)數(shù)據(jù)
MyBatis本身是一個(gè)數(shù)據(jù)庫(kù)連接框架,可以認(rèn)為是JDBC的升級(jí)版,下面這篇文章主要給大家介紹了關(guān)于mybatis查詢數(shù)據(jù)庫(kù)數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04Mybatis整合達(dá)夢(mèng)數(shù)據(jù)庫(kù)的完整步驟記錄
作為國(guó)產(chǎn)數(shù)據(jù)庫(kù),達(dá)夢(mèng)做的不錯(cuò),提供的遷移工具也相當(dāng)不錯(cuò),下面這篇文章主要給大家介紹了關(guān)于Mybatis整合達(dá)夢(mèng)數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02詳解在Spring MVC或Spring Boot中使用Filter打印請(qǐng)求參數(shù)問題
這篇文章主要介紹了詳解在Spring MVC或Spring Boot中使用Filter打印請(qǐng)求參數(shù)問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04