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

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

0.介绍预览

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

               

1.资料准备

1.1 账号注册

打开https://openhome.alipay.com,注册支付宝开放平台开发者账号

1.2 开发者认证

登录,进入开发者中心,进行开发者资质认证,并创建移动应用。

 

1.3 签约应用

创建应用后上传相关资料,上线应用并通过审核。审核通过后点击应用,进行签约,此步骤不能省略,否则或报ISV权限不足。

 

 

1.4 应用配置

打开应用信息,配置一下内容,接口签名可下载支付宝签名验签工具进行生成,生成完成后将公钥复制到平台上。

 


2.Java后台开发

添加依赖

<!-- 支付宝支付依赖 -->
<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>


 

生成统一订单

/**
* account 总金额
* sid 用户id
* desc 节点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 = "电费充值";
    String body = "贵大电费预付费充值";
    String prefix = "ALE"+sid+"E";
    String out_trade_no = WXRequestUtil.getTradeNo(prefix);

    //实例化客户端
    AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do 

",
	    AlipayUtil.APPID, AlipayUtil.PRIVATE_KEY, "json", AlipayUtil.CHARSET, AlipayUtil.PUBLIC_KEY, "RSA2");
    //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
    AlipayTradeAppPayRequest alirequest = new AlipayTradeAppPayRequest();
    //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
    AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
    model.setPassbackParams(URLEncoder.encode(body.toString()));;  //描述信息  添加附加数据
    model.setSubject(subject); //商品标题
    model.setOutTradeNo(out_trade_no); //商家订单编号
    model.setTimeoutExpress("30m"); //超时关闭该订单时间
    model.setTotalAmount(totalAmount);  //订单总金额
    model.setProductCode("QUICK_MSECURITY_PAY"); //销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY
    alirequest.setBizModel(model);
    alirequest.setNotifyUrl("http://pay.gzdxfszx.com/pay/alipay/notify.xs 

");  //回调地址
    String orderStr = "";
    try {
	//这里和普通的接口调用不同,使用的是sdkExecute
	AlipayTradeAppPayResponse response = alipayClient.sdkExecute(alirequest);
	orderStr = response.getBody();
//                System.out.println(orderStr);//就是orderString 可以直接给客户端请求,无需再做处理。
    } 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("支付宝支付结果通知"+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] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用。
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }
        //切记alipaypublickey是支付宝的公钥,请去open.alipay.com 

对应应用下查看。
        //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
        try {
            //验证签名
            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");
//                    //支付宝交易号
//                    String trade_no = params.get("trade_no");
//                    //附加数据
//                    String passback_params = URLDecoder.decode(params.get("passback_params"));

                    //商户订单号
                    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客户端开发

导入支付宝开发包

 

添加URL Types

 


在需要调用支付宝的地方实现方法

-(void)aliPay
{
    [MBProgressHUD showMessage:@"跳转中,请稍候"];
    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:@"支付宝支付结果" messge:@"本次支付未完成,您可以稍后重试!" confirm:@"好的"];
            }
            
        }];
    }failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        [MBProgressHUD hideHUD];
        NSLog(@"发生错误!%@",error);
    }];
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperation:operation];
    
    
    
}


 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值