支付宝移动支付实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

支付宝接口实现移动支付
一、加密解密
1、网银支付普遍使用的是非对称加密算法,RSA。

二、支付宝开发者平台
1、注册账号(一般是企业账号)--->创建应用--->添加功能--->申请上线--->等待审核
2、配置应用环境:设置密钥(使用密钥生成器生成)
三、Demo演示
1、下载Android版的支付宝SDK:文档中心-->移动支付的SDK
2、运行alipaydemo.
3、添加相关信息:
四、构建自己的Demo
1、主要是PayDemoActivity类的模拟;
2、导入支付宝内部的jar包;
3、最重要的还是相关信息;
4、源码页面
package com.example.paydemoopen;
import java.io.UnsupportedEncodingException;
import .URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Random;
import com.alipay.sdk.app.PayTask;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
publicclass MainActivity extends Activity{
private EditText name_et,des_et,price_et;
// 商户PID:支付宝应用中的商户id
publicstaticfinal String PARTNER ="2088221844842500";
// 商户收款账号:支付宝账号
publicstaticfinal String SELLER ="itcast1205@";
// 商户私钥,pkcs8格式
publicstaticfinal String RSA_PRIVATE
="MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAOdq0lS/uzkzwXnqJNhHq5vgSiQ3B sfa9fzJtQotYl1mEpyfOq1yfXfn9OXagqgiWpVmwxnzs6pwnjzoMx1nPDFOqechpHFy+1DeafLGRPLx Yiy/r6rl8oBd0EuFeeOeHpcsWuquydkaymgkKwgyTjnCi7TYx9FsiN5WmECxyNO9AgMBAAECgYBvHOg ujvyrI4GTMuxL+GWaa1/N8anMzgJsRMErSM1BASCQmReIbj92EiaRMpCngA80SuoEjPHINViU7/yS8p 2AOXanzriYvap01waxjLa/KEDGjYsffUcQe/SS+xxRoMNvrmPxuQJ4MPowUvdU2OKOtpD/GY6KIGdVv RQoKiCAdQJBAPiQ8ROiI4lY0qBrTY6pS1LrSIhrvjOT5nSeMpVtR0PYa+KiWhezmKRsixRdzSnhE7fv PhRprUCMdgtIdOUwWxcCQQDuVpXdlUr9ZwS571A6+1qRT1Jqt4emhyJeHE+gi/ETO/zqwAYuYaI/Xha /1Rt3I6GcVCAvOwXcAIXWx5Cm2XxLAkEA7VX32jdGly4obuQF+eHL+jCN4TR/N+BQe6lRwzvEgBN1b8 B1JYxmgxjg82FdNE+k9EuLixIcSzXSwJM+ilfRoQJBAM4E1mLFjB7jD/jRXp69axo0YN+SaZWPNiv3e
PUkQm0H66XX+v/YsXDpGe0UfztK94W0SmXJNVVotkhkFSvEz2UCQQDJYpIfoR/EUAiGas/n1LtiD3UJ E0EEGgqDyrLPpcujE4GpOLgPhP07sOTigmXJZFCLyf9TRASkVJBPf5iIvnVx";
// 支付宝公钥:指的是应用平台中支付宝提供的公钥
publicstaticfinal String RSA_PUBLIC
="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3v F1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60 j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB";
privatestaticfinalint SDK_PAY_FLAG =1;
@SuppressLint("HandlerLeak")
private Handler mHandler =new Handler(){
@SuppressWarnings("unused")
publicvoid handleMessage(Message msg){
switch(msg.what){
case SDK_PAY_FLAG:{
PayResult payResult =new PayResult((String) msg.obj);
/**
* 同步返回的结果必须放置到服务端进行验证(验证的规则请看
https:///doc2/
*
detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
* docType=1) 建议商户依赖异步通知
*/
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
if(TextUtils.equals(resultStatus,"9000")){
Toast.makeText(MainActivity.this,"支付成功
",Toast.LENGTH_SHORT).show();
}else{
// 判断resultStatus 为非"9000"则代表可能支付失败
// "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
if(TextUtils.equals(resultStatus,"8000")){
Toast.makeText(MainActivity.this,"支付结果确认中
",Toast.LENGTH_SHORT).show();
}else{
// 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
Toast.makeText(MainActivity.this,"支付失败",Toast.LENGTH_SHORT).show();
}
}
break;
}
default:
break;
}
};
};
@Override
protectedvoid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(yout.activity_main);
name_et =(EditText) findViewById(R.id.editText1);
des_et =(EditText) findViewById(R.id.editText2);
price_et =(EditText) findViewById(R.id.editText3);
}
publicvoid pay(View v){
String startPay = name_et.getText().toString();
String des = des_et.getText().toString();
String price = price_et.getText().toString();
startPay(startPay,des,price);
}
privatevoid startPay(String name,String des,String price){ //生成订单信息
String orderInfo = getOrderInfo(name, des, price);
System.out.println(orderInfo);
/**
* 特别注意,这里的签名逻辑需要放在服务端,切勿将私钥泄露在代码中!
*/
//对订单信息用私钥进行编码
String sign = sign(orderInfo);
try{
/**
* 仅需对sign 做URL编码
*/
sign =URLEncoder.encode(sign,"UTF-8");
}catch(UnsupportedEncodingException e){
e.printStackTrace();
}
/**
* 完整的符合支付宝参数规范的订单信息
*/
//支付串码
final String payInfo = orderInfo +"&sign=\""+ sign +"\"&"+ getSignType();
System.out.println(payInfo);
//通过支付串码,调用支付宝客户端进行操作
Runnable payRunnable =new Runnable(){
@Override
publicvoid run(){
// 构造PayTask 对象
PayTask alipay =new PayTask(MainActivity.this);
// 调用支付接口,获取支付结果
String result = alipay.pay(payInfo,true);
Message msg =new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必须异步调用
Thread payThread =new Thread(payRunnable);
payThread.start();
}
/**
* create the order info. 创建订单信息
*
*/
private String getOrderInfo(String subject,String body,String price){
// 签约合作者身份ID
String orderInfo ="partner="+"\""+ PARTNER +"\"";
// 签约卖家支付宝账号
orderInfo +="&seller_id="+"\""+ SELLER +"\"";
// 商户网站唯一订单号:服务器自己给定的
orderInfo +="&out_trade_no="+"\""+ getOutTradeNo()+"\"";
// 商品名称
orderInfo +="&subject="+"\""+ subject +"\"";
// 商品详情
orderInfo +="&body="+"\""+ body +"\"";
// 商品金额
orderInfo +="&total_fee="+"\""+ price +"\"";
// 服务器异步通知页面路径
//自己的服务器如果想知道致富到底有没有成功,当支付宝服务完成后,会调用此链接进行通知,此链接有自己的服务器开发人员设置
orderInfo +="&notify_url="+"\""+"http://notify.msp.hk/notify.htm"+"\"";
// 服务接口名称,固定值:不用管
orderInfo +="&service=\"mobile.securitypay.pay\"";
// 支付类型,固定值:不用管
orderInfo +="&payment_type=\"1\"";
// 参数编码,固定值:不用管
orderInfo +="&_input_charset=\"utf-8\"";
// 设置未付款交易的超时时间:不用管
// 默认30分钟,一旦超时,该笔交易就会自动被关闭。

// 取值范围:1m~15d。

// m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。

// 该参数数值不接受小数点,如1.5h,可转换为90m。

orderInfo +="&it_b_pay=\"30m\"";
// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
// orderInfo += "&extern_token=" + "\"" + extern_token + "\"";
// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空
orderInfo +="&return_url=\"\"";
return orderInfo;
}
/**
* get the out_trade_no for an order. 生成商户订单号,该值在商户端应保持唯一(可自定义格式规范)
*
*/
private String getOutTradeNo(){
SimpleDateFormat format
=new SimpleDateFormat("MMddHHmmss",Locale.getDefault());
Date date =new Date();
String key = format.format(date);
Random r =new Random();
key = key + r.nextInt();
key = key.substring(0,15);
return key;
}
/**
* sign the order info. 对订单信息进行签名
*
* @param content
* 待签名订单信息
*/
private String sign(String content){
return SignUtils.sign(content, RSA_PRIVATE);
}
/**
* get the sign type we use. 获取签名方式
*
*/
private String getSignType(){
return"sign_type=\"RSA\"";
}
}
注意:安全性完善:由于Demo中的很多信息,比如私钥、一些加密算法都直接暴露在客户端中,很容易被人破解,所以我们应该将所有这些算法都放在服务器,而客户端只需要向服务器提供商品名称、描述、价格等信息,由服务器进行加密,最终返回支付串码payInfo。

相关文档
最新文档