您的位置:首页 > 移动开发 > Android开发

安卓支付相关

2016-06-24 10:37 351 查看

移动支付的概念

    移动支付也称为手机支付,就是允许用户使用其移动终端(通常是手机)对所消费的商品或服务进行账务支付的一种服务方式。单位或个人通过移动设备、互联网或者近距离传感直接或间接向银行金融机构发送支付指令产生货币支付与资金转移行为,从而实现移动支付功能。移动支付将终端设备、互联网、应用提供商以及金融机构相融合,为用户提供货币支付、缴费等金融业务。

常见的支付厂商简介:

支付宝**:阿里公司,支付宝使用比较多.
微信**:腾讯公司,也是越来越多.
易付宝:易付宝是苏宁云商旗下的一家独立的第三方支付公司
财付通:腾讯公司
银联**:不属于某一个公司
百度钱包:百度
快钱:
ping++:整合了很多的支付平台  
万普广告平台

支付宝支付

.申请签约支付宝移动支付

              1.在支付宝网站注册企业账号------------个人账号暂时不支持

              2.申请签约支付宝移动支付

运行支付宝SDK提供的示例程序

             1.下载sdk地址:https://open.alipay.com/platform/home.htm

             2.参照文档地址:https://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103563&docType=1

             3.在签约管理这里找到pidkey为:—————————

             4.签名机制:https://doc.open.alipay.com/doc2/detail?treeId=58&articleId=103242&docType=1

             5.开发者将私钥保留,将公钥提交给支付宝网关,用于信息加密及解密

生成key

        // 商户私钥,pkcs8格式---找到

        Windows用户在cmd窗口中进行以下操作:

        C:\Users\Hammer>cd C:\OpenSSL-Win32\bin 进入OpenSSL安装目录

        C:\OpenSSL-Win32\bin>openssl.exe 进入OpenSSL程序

        OpenSSL> genrsa -out rsa_private_key.pem 1024 生成私钥

        OpenSSL> pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt Java开发者需要将私钥转换成PKCS8格式

        OpenSSL> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 生成公钥

        OpenSSL> exit ## 退出OpenSSL程序

        注意:对于使用Java的开发者,将pkcs8在console中输出的私钥去除头尾、换行和空格,作为开发者私钥,对于.NET和PHP的开发者来说,无需进行pkcs8命令行操作。

        

#### 经过以上步骤,开发者可以在当前文件夹中(Windows用户在C:\OpenSSL-Win32\bin)看到rsa_private_key.pem和rsa_public_key.pem两个文件,前者为私钥,后者为公钥。开发者将私钥保留,将公钥提交给支付宝网关,用于信息加密及解密。以下为使用OpenSSL生成的私钥文件和公钥文件示例。

集成到自己的应用中

1.jar包拷贝

    alipaySdk-20160223.jar

    android-support-v13.jar

2.

<!-- alipay sdk begin -->
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation|screenSize"
android:exported="false"
android:screenOrientation="behind"
android:windowSoftInputMode="adjustResize|stateHidden" >
</activity>

<!-- alipay sdk end -->

<activity
android:name="com.alipay.sdk.auth.AuthActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" >
</activity>


3.填写对应信息

//--------------------下面是支付相关代码----------------------------

/**
* 商品的描述信息
*/
private String desc = "";

// 商户PID
public static final String PARTNER = "";
// 商户收款账号
public static final String SELLER = "";
// 商户私钥,pkcs8格式
public static final String RSA_PRIVATE = "";
// 支付宝公钥
public static final String RSA_PUBLIC = "  ";

以上都完成之后说明你已经成功集成了。下面看支付过程。

点击支付调用如下方法:

/**
* 支付宝支付
*/
private void alipay(float allPrice) {

//得到价格
String price = allPrice+"";

/**
* 1.验证商户PID --- PARTNER       RSA_PRIVATE:私钥    商户收款账号:SELLER
*/
if (TextUtils.isEmpty(PARTNER) || TextUtils.isEmpty(RSA_PRIVATE) || TextUtils.isEmpty(SELLER)) {

new AlertDialog.Builder(this).setTitle("警告").setMessage("需要配置PARTNER | RSA_PRIVATE| SELLER")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialoginterface, int i) {
//
finish();
}
}).show();
return;
}

/**
* 验证价格、商品的描述信息。如果没商品或者没价格支付就没有意义。
*/
if (TextUtils.isEmpty(price) ||TextUtils.isEmpty(desc)) {

new AlertDialog.Builder(this).setTitle("提示").setMessage("需要填写报名费用 |费用用途")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialoginterface, int i) {
//
//                            finish();
}
}).show();
return;
}

/**
* 获得订单的信息:
* 第一个参数:商品的名称(订单的信息);第二参数是:商品的描述,第三个是商品的价格
*/
String orderInfo = getOrderInfo(desc, desc+price+"元", price);

/**
* 对商品信息进行签名:
* 特别注意,这里的签名逻辑需要放在服务端,切勿将私钥泄露在代码中!
* 将这个逻辑放在服务器,不是仅仅将私钥放在服务器。这样的话,只需要将商品信息提交到服务器
* 服务器返回一个签名回来即可。这里可将商品信息进行aes加密,服务器在进行解密。回馈时也采取加密解密的方式。
* 对称加密更安全
*/
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();

Runnable payRunnable = new Runnable() {

@Override
public void run() {
// 构造PayTask 对象
PayTask alipay = new PayTask(CheckOutActivity.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();
}


处理支付

private Handler mHandler = new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
PayResult payResult = new PayResult((String) msg.obj);
/**
* 同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc.open.alipay.com/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(CheckOutActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
} else {
// 判断resultStatus 为非"9000"则代表可能支付失败
// "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
if (TextUtils.equals(resultStatus, "8000")) {
Toast.makeText(CheckOutActivity.this, "支付结果确认中", Toast.LENGTH_SHORT).show();

} else {
// 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
Toast.makeText(CheckOutActivity.this, "支付失败", Toast.LENGTH_SHORT).show();

}
}
break;
}
default:
break;
}
};
};


其与相关代码如下:

/**
* 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 += "¬ify_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=\"m.alipay.com\"";

// 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)
// orderInfo += "&paymethod=\"expressGateway\"";

return orderInfo;
}

/**
* 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\"";
}

/**
* 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;
}


微信支付

开发文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=2_1

支付模式

1、刷卡支付

刷卡支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式。主要应用线下面对面收银的场景。

2、扫码支付

扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。

3、公众号支付

公众号支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。应用场景有:

◆ 用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付
◆ 用户的好友在朋友圈、聊天窗口等分享商家页面连接,用户点击链接打开商家页面,完成支付
◆ 将商户页面转换成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付

4、APP支付

APP支付又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式。

集成到自己的app中:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 移动支付