支付宝之移动支付的简单集成
来源:互联网 发布:b站下架 知乎 编辑:程序博客网 时间:2024/05/03 11:59
支付宝集成参考:
https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.zMbBFv&treeId=193&articleId=105297&docType=1
https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.SiQGSk&treeId=59&articleId=103563&docType=1
参照上面两个文档完成准备工作之后,得到以下数据
/** 支付宝支付业务:入参app_id */ public static final String APPID = "";/** 商户私钥,pkcs8格式 */ public static final String RSA_PRIVATE =“” //商户合作id public static final String PARTNER = ""; // 商户收款的支付宝账号 public static final String SELLER = ""; // 支付宝公钥 public static final String RSA_PUBLIC = “”
现在就来看看代码的集成。
1、将alipay-sdk-common/alipaySdk-xxxxxxxx.jar包放入商户应用工程的libs目录下
2、进入商户应用工程的Java Build Path,将libs目录下的alipaySDK-xxxxxxxx.jar导入
3、选中Order and Export,勾选alipaySDK-xxxxxxxx.jar
4、修改Manifest
在商户应用工程的AndroidManifest.xml文件里面添加声明:
<activity android:name="com.alipay.sdk.app.H5PayActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind" ></activity><activity android:name="com.alipay.sdk.auth.AuthActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind" > </activity>
和权限声明:
<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
添加混淆规则
5、在商户应用工程的proguard-project.txt里添加以下相关规则:
-libraryjars libs/alipaySDK-20150602.jar-keep class com.alipay.android.app.IAlixPay{*;}-keep class com.alipay.android.app.IAlixPay$Stub{*;}-keep class com.alipay.android.app.IRemoteServiceCallback{*;}-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}-keep class com.alipay.sdk.app.PayTask{ public *;}-keep class com.alipay.sdk.app.AuthTask{ public *;}
主要方法:调用支付宝SDK进行支付
/** * 支付宝 * call alipay sdk pay. 调用SDK支付 * */public void payOfAliMethod() { /** * call alipay sdk pay. 调用SDK支付 * */ 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; } String orderInfo = getOrderInfo(shangPin, dingdanHao, "0.01"); Log.i(TAG,"---"+orderInfo); /** * 特别注意,这里的签名逻辑需要放在服务端,切勿将私钥泄露在代码中! */ String sign = sign(orderInfo); try { /* 仅需对sign 做URL编码*/ sign = URLEncoder.encode(sign, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } LogHelper.i(TAG,"---"+sign); /** * 完整的符合支付宝参数规范的订单信息 */ final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType(); Log.i(TAG,"----"+payInfo); Runnable payRunnable = new Runnable() { @Override public void run() { // 构造PayTask 对象 PayTask alipay = new PayTask(PayOptActivity.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 += "¬ify_url=" + "\"" + "http://www.xiaohoutai.com.cn:8888/XHT/pay/alipay/notify" + "\""; // 服务接口名称, 固定值 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\""; return orderInfo;}
生成商户订单号,该值在商户端应保持唯一(可自定义格式规范)
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,"utf-8");}/** * get the sign type we use. 获取签名方式 * */private String getSignType() { return "sign_type=\"RSA\"";}
SignUtils.sign签名的方法:
public static String sign(String content, String privateKey, String input_charset){ try { PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec( Base64.decode(privateKey) ); KeyFactory keyf = KeyFactory.getInstance("RSA"); PrivateKey priKey = keyf.generatePrivate(priPKCS8); java.security.Signature signature = java.security.Signature .getInstance(SIGN_ALGORITHMS); signature.initSign(priKey); signature.update( content.getBytes(input_charset) ); byte[] signed = signature.sign(); return Base64.encode(signed); } catch (Exception e) { e.printStackTrace(); } return null;}
PayResult的代码:
public class PayResult { private String resultStatus; private String result; private String memo; public PayResult(String rawResult) { if (TextUtils.isEmpty(rawResult)) return; String[] resultParams = rawResult.split(";"); for (String resultParam : resultParams) { if (resultParam.startsWith("resultStatus")) { resultStatus = gatValue(resultParam, "resultStatus"); } if (resultParam.startsWith("result")) { result = gatValue(resultParam, "result"); } if (resultParam.startsWith("memo")) { memo = gatValue(resultParam, "memo"); } }}@Overridepublic String toString() { return "resultStatus={" + resultStatus + "};memo={" + memo + "};result={" + result + "}";}private String gatValue(String content, String key) { String prefix = key + "={"; return content.substring(content.indexOf(prefix) + prefix.length(), content.lastIndexOf("}"));}/** * @return the resultStatus */public String getResultStatus() { return resultStatus;}/** * @return the memo */public String getMemo() { return memo;}/** * @return the result */public String getResult() { return result;}
}
至此,支付宝集成就已经完成,可以开始使用了。
0 0
- 支付宝之移动支付的简单集成
- 支付宝移动支付集成
- 支付宝移动支付集成
- 移动支付之支付宝
- 移动支付之支付宝支付
- 移动支付宝的集成思路
- Android集成支付宝移动支付功能
- 简单集成支付宝
- 移动端集成支付宝
- 移动平台集成支付宝
- iOS-集成支付宝支付、微信支付简单总结
- 移动客户端集成支付宝移动支付功能详细步骤
- 集成 支付宝支付
- 集成支付宝支付
- 支付宝支付集成
- 集成支付宝支付
- 支付宝支付集成
- 支付宝支付集成
- 需求管理与分析——需求池
- DirectShow中利用SampleGrabber捕获摄像头每一帧图像,并转为BMP文件信息写入内存
- Java加密算法---sun.misc.BASE64Decoder与sun.misc.BASE64Encoder
- 中国大学MOOC-陈越、何钦铭-数据结构-2016秋2题
- WebService实例&调用本质&权限控制
- 支付宝之移动支付的简单集成
- RTMP流媒体播放过程
- 普通变量和数组作为函数参数的区别
- 深入理解动态库- 函数调用,__stdcall,__cdecl,__fastcall,thiscal
- 解决 version `GLIBC_2.17' not found
- SampleGrabber开发问题与解决方案
- C#位运算讲解与示例
- 欢迎使用CSDN-markdown编辑器
- 蓝牙基础知识