第三方支付宝集成Demo

来源:互联网 发布:php将数组转换成字符串 编辑:程序博客网 时间:2024/04/28 00:41

package com.alipay.sdk.pay.demo.util;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Collections;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Locale;import java.util.Map;import java.util.Random;import com.alipay.sdk.pay.demo.SignUtils;public class OrderInfoUtil2_0 {/** * 构造授权参数列表 *  * @param pid * @param app_id * @param target_id * @return */public static Map<String, String> buildAuthInfoMap(String pid, String app_id, String target_id, boolean rsa2) {Map<String, String> keyValues = new HashMap<String, String>();// 商户签约拿到的app_id,如:2013081700024223keyValues.put("app_id", app_id);// 商户签约拿到的pid,如:2088102123816631keyValues.put("pid", pid);// 服务接口名称, 固定值keyValues.put("apiname", "com.alipay.account.auth");// 商户类型标识, 固定值keyValues.put("app_name", "mc");// 业务类型, 固定值keyValues.put("biz_type", "openservice");// 产品码, 固定值keyValues.put("product_id", "APP_FAST_LOGIN");// 授权范围, 固定值keyValues.put("scope", "kuaijie");// 商户唯一标识,如:kkkkk091125keyValues.put("target_id", target_id);// 授权类型, 固定值keyValues.put("auth_type", "AUTHACCOUNT");// 签名类型keyValues.put("sign_type", rsa2 ? "RSA2" : "RSA");return keyValues;}/** * 构造支付订单参数列表 * @param pid * @param app_id * @param target_id * @return */public static Map<String, String> buildOrderParamMap(String app_id, boolean rsa2) {Map<String, String> keyValues = new HashMap<String, String>();keyValues.put("app_id", app_id);keyValues.put("biz_content", "{\"timeout_express\":\"30m\",\"product_code\":\"QUICK_MSECURITY_PAY\",\"total_amount\":\"0.01\",\"subject\":\"1\",\"body\":\"我是测试数据\",\"out_trade_no\":\"" + getOutTradeNo() +  "\"}");keyValues.put("charset", "utf-8");keyValues.put("method", "alipay.trade.app.pay");keyValues.put("sign_type", rsa2 ? "RSA2" : "RSA");keyValues.put("timestamp", "2016-07-29 16:55:53");keyValues.put("version", "1.0");return keyValues;}/** * 构造支付订单参数信息 *  * @param map * 支付订单参数 * @return */public static String buildOrderParam(Map<String, String> map) {List<String> keys = new ArrayList<String>(map.keySet());StringBuilder sb = new StringBuilder();for (int i = 0; i < keys.size() - 1; i++) {String key = keys.get(i);String value = map.get(key);sb.append(buildKeyValue(key, value, true));sb.append("&");}String tailKey = keys.get(keys.size() - 1);String tailValue = map.get(tailKey);sb.append(buildKeyValue(tailKey, tailValue, true));return sb.toString();}/** * 拼接键值对 *  * @param key * @param value * @param isEncode * @return */private static String buildKeyValue(String key, String value, boolean isEncode) {StringBuilder sb = new StringBuilder();sb.append(key);sb.append("=");if (isEncode) {try {sb.append(URLEncoder.encode(value, "UTF-8"));} catch (UnsupportedEncodingException e) {sb.append(value);}} else {sb.append(value);}return sb.toString();}/** * 对支付参数信息进行签名 *  * @param map *            待签名授权信息 *  * @return */public static String getSign(Map<String, String> map, String rsaKey, boolean rsa2) {List<String> keys = new ArrayList<String>(map.keySet());// key排序Collections.sort(keys);StringBuilder authInfo = new StringBuilder();for (int i = 0; i < keys.size() - 1; i++) {String key = keys.get(i);String value = map.get(key);authInfo.append(buildKeyValue(key, value, false));authInfo.append("&");}String tailKey = keys.get(keys.size() - 1);String tailValue = map.get(tailKey);authInfo.append(buildKeyValue(tailKey, tailValue, false));String oriSign = SignUtils.sign(authInfo.toString(), rsaKey, rsa2);String encodedSign = "";try {encodedSign = URLEncoder.encode(oriSign, "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return "sign=" + encodedSign;}/** * 要求外部订单号必须唯一。 * @return */private static 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;}}

package com.alipay.sdk.pay.demo;import java.util.Map;import android.text.TextUtils;public class AuthResult {private String resultStatus;private String result;private String memo;private String resultCode;private String authCode;private String alipayOpenId;public AuthResult(Map<String, String> rawResult, boolean removeBrackets) {if (rawResult == null) {return;}for (String key : rawResult.keySet()) {if (TextUtils.equals(key, "resultStatus")) {resultStatus = rawResult.get(key);} else if (TextUtils.equals(key, "result")) {result = rawResult.get(key);} else if (TextUtils.equals(key, "memo")) {memo = rawResult.get(key);}}String[] resultValue = result.split("&");for (String value : resultValue) {if (value.startsWith("alipay_open_id")) {alipayOpenId = removeBrackets(getValue("alipay_open_id=", value), removeBrackets);continue;}if (value.startsWith("auth_code")) {authCode = removeBrackets(getValue("auth_code=", value), removeBrackets);continue;}if (value.startsWith("result_code")) {resultCode = removeBrackets(getValue("result_code=", value), removeBrackets);continue;}}}private String removeBrackets(String str, boolean remove) {if (remove) {if (!TextUtils.isEmpty(str)) {if (str.startsWith("\"")) {str = str.replaceFirst("\"", "");}if (str.endsWith("\"")) {str = str.substring(0, str.length() - 1);}}}return str;}@Overridepublic String toString() {return "resultStatus={" + resultStatus + "};memo={" + memo + "};result={" + result + "}";}private String getValue(String header, String data) {return data.substring(header.length(), data.length());}/** * @return the resultStatus */public String getResultStatus() {return resultStatus;}/** * @return the memo */public String getMemo() {return memo;}/** * @return the result */public String getResult() {return result;}/** * @return the resultCode */public String getResultCode() {return resultCode;}/** * @return the authCode */public String getAuthCode() {return authCode;}/** * @return the alipayOpenId */public String getAlipayOpenId() {return alipayOpenId;}}

 





















































package com.alipay.sdk.pay.demo.util;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Collections;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Locale;import java.util.Map;import java.util.Random;import com.alipay.sdk.pay.demo.SignUtils;public class OrderInfoUtil2_0 {/** * 构造授权参数列表 *  * @param pid * @param app_id * @param target_id * @return */public static Map<String, String> buildAuthInfoMap(String pid, String app_id, String target_id, boolean rsa2) {Map<String, String> keyValues = new HashMap<String, String>();// 商户签约拿到的app_id,如:2013081700024223keyValues.put("app_id", app_id);// 商户签约拿到的pid,如:2088102123816631keyValues.put("pid", pid);// 服务接口名称, 固定值keyValues.put("apiname", "com.alipay.account.auth");// 商户类型标识, 固定值keyValues.put("app_name", "mc");// 业务类型, 固定值keyValues.put("biz_type", "openservice");// 产品码, 固定值keyValues.put("product_id", "APP_FAST_LOGIN");// 授权范围, 固定值keyValues.put("scope", "kuaijie");// 商户唯一标识,如:kkkkk091125keyValues.put("target_id", target_id);// 授权类型, 固定值keyValues.put("auth_type", "AUTHACCOUNT");// 签名类型keyValues.put("sign_type", rsa2 ? "RSA2" : "RSA");return keyValues;}/** * 构造支付订单参数列表 * @param pid * @param app_id * @param target_id * @return */public static Map<String, String> buildOrderParamMap(String app_id, boolean rsa2) {Map<String, String> keyValues = new HashMap<String, String>();keyValues.put("app_id", app_id);keyValues.put("biz_content", "{\"timeout_express\":\"30m\",\"product_code\":\"QUICK_MSECURITY_PAY\",\"total_amount\":\"0.01\",\"subject\":\"1\",\"body\":\"我是测试数据\",\"out_trade_no\":\"" + getOutTradeNo() +  "\"}");keyValues.put("charset", "utf-8");keyValues.put("method", "alipay.trade.app.pay");keyValues.put("sign_type", rsa2 ? "RSA2" : "RSA");keyValues.put("timestamp", "2016-07-29 16:55:53");keyValues.put("version", "1.0");return keyValues;}/** * 构造支付订单参数信息 *  * @param map * 支付订单参数 * @return */public static String buildOrderParam(Map<String, String> map) {List<String> keys = new ArrayList<String>(map.keySet());StringBuilder sb = new StringBuilder();for (int i = 0; i < keys.size() - 1; i++) {String key = keys.get(i);String value = map.get(key);sb.append(buildKeyValue(key, value, true));sb.append("&");}String tailKey = keys.get(keys.size() - 1);String tailValue = map.get(tailKey);sb.append(buildKeyValue(tailKey, tailValue, true));return sb.toString();}/** * 拼接键值对 *  * @param key * @param value * @param isEncode * @return */private static String buildKeyValue(String key, String value, boolean isEncode) {StringBuilder sb = new StringBuilder();sb.append(key);sb.append("=");if (isEncode) {try {sb.append(URLEncoder.encode(value, "UTF-8"));} catch (UnsupportedEncodingException e) {sb.append(value);}} else {sb.append(value);}return sb.toString();}/** * 对支付参数信息进行签名 *  * @param map *            待签名授权信息 *  * @return */public static String getSign(Map<String, String> map, String rsaKey, boolean rsa2) {List<String> keys = new ArrayList<String>(map.keySet());// key排序Collections.sort(keys);StringBuilder authInfo = new StringBuilder();for (int i = 0; i < keys.size() - 1; i++) {String key = keys.get(i);String value = map.get(key);authInfo.append(buildKeyValue(key, value, false));authInfo.append("&");}String tailKey = keys.get(keys.size() - 1);String tailValue = map.get(tailKey);authInfo.append(buildKeyValue(tailKey, tailValue, false));String oriSign = SignUtils.sign(authInfo.toString(), rsaKey, rsa2);String encodedSign = "";try {encodedSign = URLEncoder.encode(oriSign, "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return "sign=" + encodedSign;}/** * 要求外部订单号必须唯一。 * @return */private static 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;}}


package com.alipay.sdk.pay.demo;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;public class ExternalFragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {return inflater.inflate(R.layout.pay_external, container, false);}}

package com.alipay.sdk.pay.demo;import java.util.Map;import android.text.TextUtils;public class PayResult {private String resultStatus;private String result;private String memo;public PayResult(Map<String, String> rawResult) {if (rawResult == null) {return;}for (String key : rawResult.keySet()) {if (TextUtils.equals(key, "resultStatus")) {resultStatus = rawResult.get(key);} else if (TextUtils.equals(key, "result")) {result = rawResult.get(key);} else if (TextUtils.equals(key, "memo")) {memo = rawResult.get(key);}}}@Overridepublic String toString() {return "resultStatus={" + resultStatus + "};memo={" + memo+ "};result={" + result + "}";}/** * @return the resultStatus */public String getResultStatus() {return resultStatus;}/** * @return the memo */public String getMemo() {return memo;}/** * @return the result */public String getResult() {return result;}}


package com.alipay.sdk.pay.demo;import java.security.KeyFactory;import java.security.PrivateKey;import java.security.spec.PKCS8EncodedKeySpec;public class SignUtils {private static final String ALGORITHM = "RSA";private static final String SIGN_ALGORITHMS = "SHA1WithRSA";private static final String SIGN_SHA256RSA_ALGORITHMS = "SHA256WithRSA";private static final String DEFAULT_CHARSET = "UTF-8";private static String getAlgorithms(boolean rsa2) {return rsa2 ? SIGN_SHA256RSA_ALGORITHMS : SIGN_ALGORITHMS;}public static String sign(String content, String privateKey, boolean rsa2) {try {PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decode(privateKey));KeyFactory keyf = KeyFactory.getInstance(ALGORITHM);PrivateKey priKey = keyf.generatePrivate(priPKCS8);java.security.Signature signature = java.security.Signature.getInstance(getAlgorithms(rsa2));signature.initSign(priKey);signature.update(content.getBytes(DEFAULT_CHARSET));byte[] signed = signature.sign();return Base64.encode(signed);} catch (Exception e) {e.printStackTrace();}return null;}}

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="fill_parent"    android:layout_height="fill_parent" >        <LinearLayout        android:layout_width="fill_parent"        android:layout_height="match_parent"        android:orientation="vertical"        android:paddingTop="12dp" >           <Button            android:id="@+id/payV2"            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:layout_margin="10dp"            android:onClick="payV2"            android:text="支付宝支付Demo"            tools:ignore="HardcodedText" />         <Button            android:id="@+id/authV2"            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:layout_margin="10dp"            android:onClick="authV2"            android:text="支付宝授权Demo"            tools:ignore="HardcodedText"             android:visibility="gone"             />        <Button            android:id="@+id/h5pay"            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:layout_margin="10dp"            android:onClick="h5Pay"            android:text="网页支付转native"            tools:ignore="HardcodedText"            android:visibility="gone"/>                <TextView             android:layout_height="wrap_content"            android:layout_width="wrap_content"            android:layout_margin="12dp"            android:text="重要说明:\n本Demo为了方便向商户展示支付宝的支付流程,所以订单信息的加签过程放在客户端完成;\n在商户的真实App内,为了防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险;\n商户privatekey等数据严禁放在客户端,订单信息的加签过程也务必放在服务端完成;\n若商户接入时不遵照此说明,因此造成了损失,需自行承担。"            android:textColor="#FF0000" />    </LinearLayout></ScrollView>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <ImageView        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:background="@drawable/msp_demo_title_bg"        android:scaleType="center"        android:src="@drawable/msp_demo_title"        tools:ignore="ContentDescription" />    <fragment        android:id="@+id/fragment"        android:name="com.alipay.sdk.pay.demo.ExternalFragment"        android:layout_width="fill_parent"        android:layout_height="wrap_content" /></LinearLayout>


    <uses-sdk        android:minSdkVersion="4"        android:targetSdkVersion="8"        tools:ignore="OldTargetApi" />    <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" />

 <!-- 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>         <activity            android:name="com.alipay.sdk.app.H5AuthActivity"            android:configChanges="orientation|keyboardHidden|navigation"            android:exported="false"            android:screenOrientation="behind"            android:windowSoftInputMode="adjustResize|stateHidden" >        </activity>        


    compile files('libs/alipaySdk-20170922.jar')    compile 'com.android.support:support-v4:26.+'


-dontshrink-dontpreverify -dontoptimize -dontusemixedcaseclassnames -flattenpackagehierarchy-allowaccessmodification -printmapping map.txt -optimizationpasses 7 -verbose -keepattributes Exceptions,InnerClasses-dontskipnonpubliclibraryclasses -dontskipnonpubliclibraryclassmembers -ignorewarnings-keep public class * extends android.app.Activity-keep public class * extends android.app.Application-keep public class * extends android.app.Service-keep public class * extends android.content.BroadcastReceiver-keep public class * extends android.content.ContentProvider-keep public class * extends java.lang.Throwable {*;}-keep public class * extends java.lang.Exception {*;}-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 *;}-keep class com.alipay.sdk.app.H5PayCallback {    <fields>;    <methods>;}-keep class com.alipay.android.phone.mrpc.core.** { *; }-keep class com.alipay.apmobilesecuritysdk.** { *; }-keep class com.alipay.mobile.framework.service.annotation.** { *; }-keep class com.alipay.mobilesecuritysdk.face.** { *; }-keep class com.alipay.tscenter.biz.rpc.** { *; }-keep class org.json.alipay.** { *; }-keep class com.alipay.tscenter.** { *; }-keep class com.ta.utdid2.** { *;}-keep class com.ut.device.** { *;}-keepclasseswithmembernames class * {    native <methods>;}-keepclasseswithmembers class * {    public <init>(android.content.Context, android.util.AttributeSet);}-keepclasseswithmembers class * {    public <init>(android.content.Context, android.util.AttributeSet, int);}-keepclassmembers class * extends android.app.Activity {   public void *(android.view.View);}-keepclassmembers enum * {    public static **[] values();    public static ** valueOf(java.lang.String);}-keep class * implements android.os.Parcelable {  public static final android.os.Parcelable$Creator *;}# adding this in to preserve line numbers so that the stack traces# can be remapped-renamesourcefileattribute SourceFile-keepattributes SourceFile,LineNumberTable










原创粉丝点击